<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-04-11T00:46:38.924085" rpa="false" schemaversion="5">
<suite id="s1" name="openflowplugin-clustering.txt">
<suite id="s1-s1" name="Cluster HA Owner Failover" source="/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustering/010__Cluster_HA_Owner_Failover.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-11T00:46:39.573731" 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-11T00:46:39.569643" elapsed="0.004155"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-11T00:46:39.569149" elapsed="0.004733"/>
</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-11T00:46:39.578967" 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-11T00:46:39.575374" elapsed="0.003627"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-11T00:46:39.579243" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:39.579106" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:39.579077" elapsed="0.000244"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.579889" 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-11T00:46:39.579499" elapsed="0.000445"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.580476" 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-11T00:46:39.580128" 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-11T00:46:39.581074" elapsed="0.000293"/>
</kw>
<msg time="2026-04-11T00:46:39.581494" level="INFO">${status} = PASS</msg>
<msg time="2026-04-11T00:46:39.581543" 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-11T00:46:39.580684" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.582141" 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-11T00:46:39.581739" elapsed="0.000433"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.583870" 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-11T00:46:39.583590" elapsed="0.000308"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.584306" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:46:39.584049" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.584864" 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-11T00:46:39.584513" elapsed="0.000379"/>
</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-11T00:46:39.587466" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:46:39.587256" elapsed="0.000285"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.584955" elapsed="0.002616"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.588128" 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-11T00:46:39.587736" elapsed="0.000436"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.588737" 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-11T00:46:39.588334" elapsed="0.000446"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.589311" 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-11T00:46:39.588940" elapsed="0.000413"/>
</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-11T00:46:39.583097" elapsed="0.006331"/>
</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-11T00:46:39.574983" elapsed="0.014505"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.589671" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:39.589555" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:39.589536" elapsed="0.000203"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.592735" 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-11T00:46:39.592334" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.593281" 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-11T00:46:39.592987" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:39.593354" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:46:39.593545" 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-11T00:46:39.592001" elapsed="0.001568"/>
</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-11T00:46:39.593915" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:46:39.593739" elapsed="0.000236"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.593623" elapsed="0.000379"/>
</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-11T00:46:39.589959" elapsed="0.004098"/>
</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-11T00:46:39.594252" elapsed="0.000236"/>
</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-11T00:46:39.594813" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:46:39.594668" elapsed="0.000210"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.594541" elapsed="0.000365"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-11T00:46:39.574307" elapsed="0.020656"/>
</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-11T00:46:39.597626" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:39.597512" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:39.597493" elapsed="0.000204"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.602171" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:39.602033" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:39.602014" elapsed="0.000237"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.603197" 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-11T00:46:39.602820" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.603689" 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-11T00:46:39.603396" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:39.603760" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:46:39.603915" 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-11T00:46:39.602494" 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-11T00:46:39.604290" 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-11T00:46:39.604551" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:46:39.604405" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:46:39.604372" elapsed="0.000257"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:46:39.604149" elapsed="0.000503"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.603991" elapsed="0.000687"/>
</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-11T00:46:39.601747" elapsed="0.002985"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-11T00:46:39.595553" elapsed="0.009233"/>
</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-11T00:46:39.595113" elapsed="0.009714"/>
</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-11T00:46:39.568721" elapsed="0.036154"/>
</kw>
<test id="s1-s1-t1" name="Check Shards Status Before Fail" line="16">
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:46:39.625742" elapsed="0.000254"/>
</kw>
<msg time="2026-04-11T00:46:39.626083" 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-11T00:46:39.624997" elapsed="0.001188"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default', 'entity-ownership'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:46:39.624542" elapsed="0.001732"/>
</kw>
<msg time="2026-04-11T00:46:39.626324" 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-11T00:46:39.616508" elapsed="0.009864"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:46:39.616099" elapsed="0.010366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.627540" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:39.627146" elapsed="0.000441"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:46:39.632535" 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-11T00:46:39.632140" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.633005" 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-11T00:46:39.632721" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:39.633076" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:46:39.633232" 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-11T00:46:39.631771" elapsed="0.001485"/>
</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-11T00:46:39.633422" elapsed="0.000163"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.634080" level="INFO">${ds_type} = operational</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-11T00:46:39.633743" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.634540" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:46:39.634277" elapsed="0.000289"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.634947" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:46:39.634713" elapsed="0.000259"/>
</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-11T00:46:39.635442" 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-11T00:46:39.635694" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:46:39.635548" 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-11T00:46:39.635913" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:46:39.635773" 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-11T00:46:39.636134" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:46:39.635991" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:46:39.635530" elapsed="0.000680"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:46:39.635256" elapsed="0.000978"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.635020" elapsed="0.001240"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:46:39.636300" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:46:39.636522" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:46:39.636568" 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-11T00:46:39.631059" elapsed="0.005531"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.637145" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:46:39.637223" 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-11T00:46:39.636759" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.637905" 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-11T00:46:39.637600" elapsed="0.000395">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:39.637362" elapsed="0.000707">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:39.637342" elapsed="0.000758">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-11T00:46:39.638277" 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-11T00:46:39.638469" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.638537" elapsed="0.000016"/>
</return>
<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>
<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-11T00:46:39.628575" elapsed="0.010077">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:46:39.628335" elapsed="0.010388">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:46:39.628198" elapsed="0.010580">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.627808" elapsed="0.011061">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.639099" elapsed="0.000025"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.605504" elapsed="0.033712">No leader found.</status>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.604935" elapsed="0.034430">No leader found.</status>
</test>
<test id="s1-s1-t2" name="Start Mininet Multiple Connections" line="20">
<kw name="Start Mininet Multiple Controllers" owner="MininetKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.647287" 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-11T00:46:39.646914" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.647773" 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-11T00:46:39.647488" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:39.647844" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:46:39.647998" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:39.646540" elapsed="0.001482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.648417" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:39.648192" elapsed="0.000271"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.650846" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:46:39.650584" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:39.650563" elapsed="0.000364"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-11T00:46:39.651292" 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-11T00:46:39.651418" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-11T00:46:39.651106" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.651974" level="INFO">Attempting to execute command "sudo mn -c" on remote system "" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:39.651596" elapsed="0.000424"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-11T00:46:39.652575" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-11T00:46:39.652174" elapsed="0.000427"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.653473" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:46:39.653550" 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-11T00:46:39.653197" elapsed="0.000376"/>
</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-11T00:46:39.653766" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-11T00:46:39.654987" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-11T00:46:39.655688" 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-11T00:46:39.654669" elapsed="0.003972">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-11T00:46:39.658702" 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-11T00:46:39.654290" elapsed="0.004471"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.652813" elapsed="0.006058">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.659059" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.659233" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.659425" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.659558" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:39.659519" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:46:39.659493" elapsed="0.000127"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.659705" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:39.659670" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:46:39.659656" elapsed="0.000109"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.659795" elapsed="0.000013"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T00:46:39.662401" elapsed="0.000311"/>
</kw>
<kw name="Open 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-11T00:46:39.662873" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-11T00:46:39.663168" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-11T00:46:39.660109" elapsed="0.003210"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.650031" elapsed="0.013380">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-11T00:46:39.663469" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.649488" elapsed="0.014027"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.649001" elapsed="0.014610">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.663794" elapsed="0.000024"/>
</kw>
<arg>${mininet}</arg>
<status status="FAIL" start="2026-04-11T00:46:39.648658" elapsed="0.015245">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.667850" elapsed="0.000026"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.668070" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.668313" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:46:39.668154" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:46:39.668137" elapsed="0.000265"/>
</if>
<if>
<branch type="IF" condition="'${protocol}' == 'ssl'">
<kw name="Install Certificates In Mininet" owner="MininetKeywords">
<doc>Copy and install certificates in simulator.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.668653" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:46:39.668457" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:46:39.668441" elapsed="0.000288"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>Start mininet ${options}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.668884" elapsed="0.000020"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>sudo mn ${options}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.669045" elapsed="0.000019"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.669239" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Create controller configuration</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.669433" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${controller_opt}</var>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.669615" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<var>${controller_opt}</var>
<arg>${controller_opt}</arg>
<arg>${SPACE}${protocol}:${ODL_SYSTEM_${index}_IP}:${ofport}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.669892" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${controller_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.670072" elapsed="0.000019"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:46:39.669749" elapsed="0.000372"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.669687" elapsed="0.000483"/>
</for>
<kw name="Log" owner="BuiltIn">
<arg>Open extra SSH connection to configure the OVS bridges</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.670327" elapsed="0.000020"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.674328" elapsed="0.000028"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${num_bridges}</var>
<arg>sudo ovs-vsctl show | grep Bridge | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.674529" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${num_bridges}</var>
<arg>${num_bridges}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.674717" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${bridges}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.674901" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<var>${bridge}</var>
<arg>sudo ovs-vsctl show | grep Bridge | cut -c 12- | sort | head -${i} | tail -1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.675201" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo ovs-vsctl del-controller ${bridge} &amp;&amp; sudo ovs-vsctl set bridge ${bridge} protocols=OpenFlow${ofversion}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.675366" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${bridges}</arg>
<arg>${bridge}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.675541" elapsed="0.000020"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T00:46:39.675069" elapsed="0.000524"/>
</iter>
<var>${i}</var>
<value>1</value>
<value>${num_bridges+1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.674987" elapsed="0.000633"/>
</for>
<kw name="Log" owner="BuiltIn">
<arg>Configure OVS controllers ${controller_opt} in all bridges</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.675778" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo ovs-vsctl set-controller ${bridge} ${controller_opt}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.676018" elapsed="0.000019"/>
</kw>
<var name="${bridge}"/>
<status status="NOT RUN" start="2026-04-11T00:46:39.675893" elapsed="0.000175"/>
</iter>
<var>${bridge}</var>
<value>@{bridges}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.675843" elapsed="0.000250"/>
</for>
<kw name="Log" owner="BuiltIn">
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.676246" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${output}</var>
<arg>sudo ovs-vsctl show</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.676428" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.676606" elapsed="0.000020"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.676762" elapsed="0.000019"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.676816" elapsed="0.000014"/>
</return>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<arg>--topo tree,2</arg>
<doc>Start Mininet with custom topology and connect to list of controllers in ${controller_index_list} or all if no list is provided.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.644215" elapsed="0.032701">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.677093" elapsed="0.000020"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>OVSDB.Check OVS OpenFlow Connections</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>9</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.677263" elapsed="0.000020"/>
</kw>
<doc>Start mininet tree,2 with connection to all cluster instances.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.639595" elapsed="0.037841">OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t3" name="Check Entity Owner Status And Find Owner and Successor Before Fail" line="29">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.711863" 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-11T00:46:39.711472" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.712336" 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-11T00:46:39.712048" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:39.712424" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:46:39.712620" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:39.711091" elapsed="0.001555"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:39.717140" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:39.716955" elapsed="0.000212"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:39.717316" elapsed="0.000214"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:39.717892" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:39.717682" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.718370" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:39.718084" elapsed="0.000344"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:39.718574" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:39.719119" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:39.718914" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.719570" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:39.719309" elapsed="0.000303"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.720099" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:39.719761" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.720544" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:39.720289" elapsed="0.000298"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.721022" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:39.720741" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:39.727509" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:39.736055" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.736793" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:39.736434" elapsed="0.000386"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:39.737936" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.737405" elapsed="0.000685">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.738307" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.737003" elapsed="0.001437">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.738619" elapsed="0.000025"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.738795" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.738966" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.739136" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.739297" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.739474" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.739637" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.739803" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.740003" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.740260" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.740502" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.740697" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:39.740134" elapsed="0.000645"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.740069" elapsed="0.000738"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.740945" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.741008" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.735571" elapsed="0.005545">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.741184" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.725305" elapsed="0.015978">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.741475" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.745600" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.745791" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.745856" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.716420" elapsed="0.029542">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:39.746078" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:39.746122" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:39.715847" elapsed="0.030297"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.746351" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:39.746242" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:39.746223" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:39.747714" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.748379" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:39.748078" elapsed="0.000387"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:39.749249" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.748979" elapsed="0.000364">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.749421" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.748646" elapsed="0.000881">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.749732" elapsed="0.000027"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.749908" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.750081" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.750273" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.750454" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.750619" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.750781" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.750948" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.751109" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.751363" elapsed="0.000034"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.751549" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.751707" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:39.751237" elapsed="0.000523"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.751173" elapsed="0.000612"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.751920" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.751979" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.747164" elapsed="0.004918">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:39.752193" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:39.752242" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:39.746578" elapsed="0.005688"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:39.753049" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.752735" elapsed="0.000379">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:39.752518" elapsed="0.000659">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:39.752328" elapsed="0.000881">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.753253" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.715293" elapsed="0.038055">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.753539" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.753703" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.753764" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:39.712940" elapsed="0.040922">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.754068" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.754293" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.754482" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.754644" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.754808" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:39.754969" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:39.755030" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.710456" elapsed="0.044671">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:40.786302" 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-11T00:46:40.785758" elapsed="0.000587"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:40.786907" 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-11T00:46:40.786543" elapsed="0.000392"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:40.786986" elapsed="0.000053"/>
</return>
<msg time="2026-04-11T00:46:40.787191" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:40.785341" elapsed="0.001882"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:40.791951" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:40.791743" elapsed="0.000236"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:40.792133" elapsed="0.000197"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:40.792717" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:40.792501" elapsed="0.000243"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:40.793194" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:40.792935" elapsed="0.000302"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:40.793399" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:40.793950" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:40.793741" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:40.794419" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:40.794144" elapsed="0.000325"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:40.795063" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:40.794634" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:40.795520" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:40.795261" elapsed="0.000305"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:40.796077" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:40.795789" elapsed="0.000315"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:40.802622" elapsed="0.000262"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:40.811366" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:40.812124" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:40.811747" elapsed="0.000403"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:40.813351" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:40.812758" elapsed="0.000791">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:40.813715" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:40.812336" elapsed="0.001499">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.814007" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.814178" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.814350" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.814538" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.814702" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.814889" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.815050" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.815216" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.815375" elapsed="0.000034"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.815665" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.815888" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.816079" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:40.815535" elapsed="0.000625"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:40.815462" elapsed="0.000728"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.816332" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:40.816417" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:40.810871" elapsed="0.005659">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:40.816598" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:40.800431" elapsed="0.016265">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.816910" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.821097" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.821288" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:40.821354" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:40.791180" elapsed="0.030339">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:40.821633" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:40.821675" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:40.790568" elapsed="0.031130"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:40.821901" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:40.821784" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:40.821763" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:40.823283" elapsed="0.000228"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:40.823962" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:40.823662" elapsed="0.000325"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:40.824786" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:40.824515" elapsed="0.000362">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:40.824937" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:40.824167" elapsed="0.000873">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.825208" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.825376" elapsed="0.000036"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.825564" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.825729" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.825890" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.826055" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.826214" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.826393" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.826563" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.826839" elapsed="0.000028"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.827016" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.827174" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:40.826691" elapsed="0.000571"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:40.826627" elapsed="0.000662"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.827443" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:40.827503" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:40.822717" elapsed="0.004889">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:40.827718" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:40.827761" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:40.822116" elapsed="0.005667"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:40.830080" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:40.829756" elapsed="0.000391">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:40.829533" elapsed="0.000678">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:40.827845" elapsed="0.002399">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:40.830291" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:40.789983" elapsed="0.040421">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.830581" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.830755" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:40.830818" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:40.787541" elapsed="0.043375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.831081" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.831256" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.831437" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.831601" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.831766" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:40.831929" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:40.831991" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:40.784494" elapsed="0.047594">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:41.860306" 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-11T00:46:41.859799" elapsed="0.000544"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:41.860838" 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-11T00:46:41.860537" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:41.860915" elapsed="0.000046"/>
</return>
<msg time="2026-04-11T00:46:41.861100" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:41.859378" elapsed="0.001754"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:41.865817" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:41.865619" elapsed="0.000225"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:41.865994" elapsed="0.000203"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:41.866582" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:41.866349" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:41.867050" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:41.866796" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:41.867235" elapsed="0.000242"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:41.867830" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:41.867627" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:41.868262" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:41.868021" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:41.868814" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:41.868474" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:41.869233" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:41.869001" elapsed="0.000277"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:41.869724" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:41.869442" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:41.876404" elapsed="0.000214"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:41.884943" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:41.885722" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:41.885308" elapsed="0.000440"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:41.886875" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:41.886321" elapsed="0.000711">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:41.887196" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:41.885933" elapsed="0.001410">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.887544" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.887716" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.887889" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.888054" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.888279" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.888458" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.888622" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.888788" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.888950" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.889228" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.889467" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.889662" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:41.889099" elapsed="0.000644"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:41.889024" elapsed="0.000748"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.889914" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:41.889974" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:41.884459" elapsed="0.005622">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:41.890149" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:41.874144" elapsed="0.016104">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.890436" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.894631" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.894825" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:41.894889" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:41.865066" elapsed="0.029928">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:41.895108" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:41.895152" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:41.864512" elapsed="0.030663"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:41.895482" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:41.895263" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:41.895241" elapsed="0.000309"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:41.896845" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:41.897575" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:41.897244" elapsed="0.000357"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:41.898440" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:41.898128" elapsed="0.000405">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:41.898596" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:41.897782" elapsed="0.000918">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.898871" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.899039" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.899207" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.899419" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.899589" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.899750" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.899912" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.900080" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.900240" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.900508" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.900678" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.900836" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:41.900367" elapsed="0.000521"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:41.900304" elapsed="0.000609"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.901055" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:41.901113" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:41.896295" elapsed="0.004921">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:41.901330" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:41.901373" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:41.895701" elapsed="0.005710"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:41.902196" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:41.901706" elapsed="0.000552">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:41.901493" elapsed="0.000828">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:41.901474" elapsed="0.000879">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:41.902414" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:41.863942" elapsed="0.038572">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.902727" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.902893" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:41.902954" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:41.861451" elapsed="0.041601">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.903218" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.903440" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.903614" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.903773" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.903937" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:41.904105" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:41.904165" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:41.858544" elapsed="0.045719">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:42.935716" 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-11T00:46:42.935202" elapsed="0.000550"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:42.936255" 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-11T00:46:42.935944" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:42.936334" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:46:42.936529" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:42.934810" elapsed="0.001745"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:42.941487" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:42.941252" elapsed="0.000265"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:42.941692" elapsed="0.000253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:42.942434" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:42.942156" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:42.942951" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:42.942665" elapsed="0.000334"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:42.943147" elapsed="0.000185"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:42.943714" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:42.943502" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:42.944257" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:42.944004" elapsed="0.000296"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:42.944819" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:42.944469" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:42.945252" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:42.945014" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:42.945750" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:42.945460" elapsed="0.000325"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:42.952321" elapsed="0.000233"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:42.960961" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:42.961727" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:42.961326" elapsed="0.000427"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:42.962926" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:42.962366" elapsed="0.000719">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:42.963251" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:42.961940" elapsed="0.001432">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.963565" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.963736" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.963945" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.964120" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.964283" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.964461" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.964625" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.964799" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.964960" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.965236" elapsed="0.000025"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.965477" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.965670" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:42.965108" elapsed="0.000643"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:42.965033" elapsed="0.000747"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.965922" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:42.965982" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:42.960472" elapsed="0.005619">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:42.966160" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:42.950126" elapsed="0.016172">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.966492" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.970592" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.970786" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:42.970852" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:42.940629" elapsed="0.030330">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:42.971071" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:42.971114" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:42.939991" elapsed="0.031145"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:42.971343" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:42.971226" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:42.971205" elapsed="0.000272"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:42.972781" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:42.973461" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:42.973143" elapsed="0.000344"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:42.974290" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:42.974027" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:42.974494" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:42.973669" elapsed="0.000930">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.974773" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.974942" elapsed="0.000019"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.975113" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.975279" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.975466" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.975629" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.975791" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.975982" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.976149" elapsed="0.000052"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.976601" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.976779" elapsed="0.000026"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.976948" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:42.976315" elapsed="0.000687"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:42.976250" elapsed="0.000798"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.977241" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:42.977308" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:42.972222" elapsed="0.005209">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:42.977546" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:42.977590" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:42.971628" elapsed="0.005984"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:42.978223" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:42.977907" elapsed="0.000378">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:42.977694" elapsed="0.000654">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:42.977675" elapsed="0.000719">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:42.978443" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:42.939355" elapsed="0.039187">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.978725" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.978897" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:42.978959" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:42.936868" elapsed="0.042193">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.979227" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.979416" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.979586" elapsed="0.000025"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.979754" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.979931" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:42.980094" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:42.980154" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:42.933980" elapsed="0.046306">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:44.010062" 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-11T00:46:44.009596" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:44.010621" 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-11T00:46:44.010267" elapsed="0.000381"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:44.010697" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:46:44.010870" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:44.009181" elapsed="0.001714"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:44.015515" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:44.015306" elapsed="0.000235"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:44.015692" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:44.016238" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:44.016032" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:44.016758" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:44.016502" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:44.016946" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:44.017491" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:44.017272" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:44.017922" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:44.017682" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:44.018653" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:44.018110" elapsed="0.000569"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:44.019082" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:44.018844" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:44.019579" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:44.019279" elapsed="0.000326"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:44.025917" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:44.034522" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:44.035274" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:44.034889" elapsed="0.000411"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:44.036467" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:44.035901" elapsed="0.000726">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:44.036789" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:44.035513" elapsed="0.001402">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.037100" elapsed="0.000025"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.037366" elapsed="0.000038"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.037563" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.037731" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.037897" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.038058" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.038222" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.038405" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.038569" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.038844" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.039068" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.039260" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:44.038715" elapsed="0.000626"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:44.038641" elapsed="0.000728"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.039527" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:44.039587" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:44.034018" elapsed="0.005677">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:44.039763" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:44.023722" elapsed="0.016140">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.040036" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.044195" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.044459" elapsed="0.000024"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:44.044529" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:44.014767" elapsed="0.029867">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:44.044749" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:44.044793" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:44.014197" elapsed="0.030618"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:44.045075" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:44.044943" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:44.044920" elapsed="0.000228"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:44.046480" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:44.047146" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:44.046842" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:44.047969" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:44.047704" elapsed="0.000356">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:44.048128" elapsed="0.000160"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:44.047352" elapsed="0.001026">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.048609" elapsed="0.000030"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.048790" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.048970" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.049138" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.049301" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.049477" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.049642" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.049810" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.049970" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.050232" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.050414" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.050576" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:44.050106" elapsed="0.000522"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:44.050036" elapsed="0.000618"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.050791" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:44.050849" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:44.045926" elapsed="0.005026">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:44.051064" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:44.051107" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:44.045299" elapsed="0.005831"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:44.051762" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:44.051440" elapsed="0.000393">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:44.051211" elapsed="0.000684">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:44.051192" elapsed="0.000770">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:44.052011" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:44.013646" elapsed="0.038470">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.052295" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.052491" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:44.052561" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:44.011193" elapsed="0.041466">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.052826" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.053003" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.053172" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.053332" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.053512" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:44.053676" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:44.053736" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:44.008337" elapsed="0.045497">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:45.085036" 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-11T00:46:45.084513" elapsed="0.000562"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:45.085564" 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-11T00:46:45.085248" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:45.085639" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:46:45.085813" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:45.084116" elapsed="0.001721"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:45.090393" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:45.090189" elapsed="0.000234"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:45.090574" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:45.091126" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:45.090919" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:45.091691" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:45.091419" elapsed="0.000314"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:45.091879" elapsed="0.000354"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:45.092613" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:45.092402" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:45.093064" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:45.092805" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:45.093611" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:45.093255" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:45.094036" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:45.093801" elapsed="0.000278"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:45.094523" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:45.094227" elapsed="0.000321"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:45.100840" elapsed="0.000223"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:45.109348" elapsed="0.000221"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:45.110092" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:45.109721" elapsed="0.000396"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:45.111237" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:45.110711" elapsed="0.000698">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:45.111573" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:45.110301" elapsed="0.001391">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.111864" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.112035" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.112211" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.112378" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.112559" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.112720" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.112888" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.113088" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.113250" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.113537" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.113758" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.113948" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:45.113408" elapsed="0.000622"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:45.113322" elapsed="0.000737"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.114200" elapsed="0.000054"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:45.114296" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:45.108853" elapsed="0.005565">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:45.114488" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:45.098672" elapsed="0.015920">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.114767" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.118989" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.119182" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:45.119248" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:45.089657" elapsed="0.029694">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:45.119519" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:45.119563" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:45.089081" elapsed="0.030505"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:45.119786" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:45.119671" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:45.119650" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:45.121154" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:45.121832" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:45.121532" elapsed="0.000325"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:45.122642" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:45.122365" elapsed="0.000363">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:45.122789" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:45.122034" elapsed="0.000856">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.123058" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.123227" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.123422" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.123598" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.123797" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.123961" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.124124" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.124292" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.124473" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.124727" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.124895" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.125068" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:45.124603" elapsed="0.000518"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:45.124539" elapsed="0.000624"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.125306" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:45.125365" elapsed="0.000028"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:45.120594" elapsed="0.004892">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:45.125595" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:45.125638" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:45.119999" elapsed="0.005661"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:45.126267" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:45.125954" elapsed="0.000383">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:45.125739" elapsed="0.000677">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:45.125721" elapsed="0.000729">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:45.126496" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:45.088519" elapsed="0.038078">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.126769" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.126932" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:45.126993" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:45.086133" elapsed="0.040961">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.127261" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.127452" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.127620" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.127814" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.127985" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:45.128148" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:45.128209" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:45.083329" elapsed="0.044982">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:46.158139" 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-11T00:46:46.157651" elapsed="0.000533"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:46.158668" 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-11T00:46:46.158354" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:46.158745" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:46:46.158913" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:46.157161" elapsed="0.001776"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:46.163701" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:46.163501" elapsed="0.000227"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:46.163878" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:46.164442" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:46.164218" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:46.164911" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:46.164656" elapsed="0.000297"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:46.165097" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:46.165688" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:46.165440" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:46.166122" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:46.165880" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:46.166680" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:46.166311" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:46.167102" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:46.166870" elapsed="0.000275"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:46.167596" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:46.167291" elapsed="0.000331"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:46.174153" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:46.182838" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:46.183590" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:46.183201" elapsed="0.000416"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:46.184813" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:46.184259" elapsed="0.000716">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:46.185138" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:46.183868" elapsed="0.001391">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.185451" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.185644" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.185819" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.185986" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.186157" elapsed="0.000024"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.186346" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.186532" elapsed="0.000026"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.186707" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.186867" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.187147" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.187372" elapsed="0.000045"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.187588" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:46.187018" elapsed="0.000649"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:46.186946" elapsed="0.000752"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.187838" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:46.187897" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:46.182334" elapsed="0.005669">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:46.188071" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:46.171885" elapsed="0.016283">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.188339" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.192478" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.192669" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:46.192768" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:46.162877" elapsed="0.029998">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:46.192986" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:46.193029" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:46.162300" elapsed="0.030752"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:46.193258" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:46.193140" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:46.193119" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:46.194668" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:46.195326" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:46.195026" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:46.196146" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:46.195885" elapsed="0.000354">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:46.196301" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:46.195553" elapsed="0.000865">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.196618" elapsed="0.000027"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.196824" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.197017" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.197203" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.197410" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.199473" elapsed="0.000047"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.199707" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.199877" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.200044" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.200476" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.200674" elapsed="0.000026"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.200848" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:46.200189" elapsed="0.000712"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:46.200117" elapsed="0.000810"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.201064" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:46.201122" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:46.194114" elapsed="0.007147">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:46.201409" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:46.201503" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:46.193498" elapsed="0.008030"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:46.202205" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:46.201854" elapsed="0.000423">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:46.201639" elapsed="0.000703">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:46.201616" elapsed="0.000758">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:46.202442" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:46.161757" elapsed="0.040785">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.202724" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.202898" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:46.202975" elapsed="0.000020"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:46.159270" elapsed="0.043832">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.203317" elapsed="0.000030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.203586" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.203813" elapsed="0.000027"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.204026" elapsed="0.000025"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.204239" elapsed="0.000027"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:46.204483" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:46.204566" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:46.156326" elapsed="0.048345">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:47.235279" 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-11T00:46:47.234794" elapsed="0.000520"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:47.235801" 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-11T00:46:47.235504" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:47.235876" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:46:47.236046" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:47.234359" elapsed="0.001712"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:47.240697" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:47.240495" elapsed="0.000229"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:47.240872" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:47.241445" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:47.241221" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:47.241915" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:47.241661" elapsed="0.000295"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:47.242101" elapsed="0.000207"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:47.242677" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:47.242472" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:47.243106" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:47.242866" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:47.245472" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:47.243295" elapsed="0.002205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:47.245910" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:47.245668" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:47.246420" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:47.246103" elapsed="0.000345"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:47.252706" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:47.261229" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:47.261982" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:47.261606" elapsed="0.000402"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:47.263159" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:47.262628" elapsed="0.000694">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:47.263505" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:47.262210" elapsed="0.001415">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.263798" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.263969" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.264141" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.264313" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.264507" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.264672" elapsed="0.000025"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.264841" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.265009" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.265172" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.265460" elapsed="0.000058"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.265726" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.265918" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:47.265315" elapsed="0.000692"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:47.265243" elapsed="0.000794"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.266209" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:47.266270" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:47.260735" elapsed="0.005642">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:47.266462" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:47.250549" elapsed="0.016012">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.266735" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.270883" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.271073" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:47.271138" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:47.239948" elapsed="0.031294">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:47.271354" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:47.271412" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:47.239376" elapsed="0.032060"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:47.271638" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:47.271522" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:47.271502" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:47.272995" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:47.273672" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:47.273351" elapsed="0.000347"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:47.274547" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:47.274241" elapsed="0.000392">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:47.274695" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:47.273875" elapsed="0.000921">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.274964" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.275170" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.275343" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.275528" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.275701" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.275863" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.276025" elapsed="0.000026"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.276202" elapsed="0.000163"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.276537" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.276796" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.276967" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.277127" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:47.276669" elapsed="0.000511"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:47.276604" elapsed="0.000602"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.277345" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:47.277419" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:47.272459" elapsed="0.005067">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:47.277636" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:47.277679" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:47.271851" elapsed="0.005851"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:47.278328" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:47.277993" elapsed="0.000409">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:47.277782" elapsed="0.000685">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:47.277764" elapsed="0.000734">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:47.278544" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:47.238838" elapsed="0.039801">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.278812" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.278978" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:47.279040" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:47.236458" elapsed="0.042677">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.279346" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.279538" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.279706" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.279865" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.280037" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:47.280200" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:47.280260" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:47.233550" elapsed="0.046806">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:48.311602" 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-11T00:46:48.311117" elapsed="0.000519"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:48.312172" 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-11T00:46:48.311869" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:48.312248" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:46:48.312438" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:48.310723" elapsed="0.001741"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:48.317054" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:48.316862" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:48.317232" elapsed="0.000208"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:48.317800" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:48.317594" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:48.318267" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:48.318013" elapsed="0.000296"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:48.318468" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:48.319020" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:48.318816" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:48.319468" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:48.319211" elapsed="0.000298"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:48.319997" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:48.319659" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:48.320649" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:48.320188" elapsed="0.000505"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:48.321125" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:48.320842" elapsed="0.000310"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:48.327512" elapsed="0.000279"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:48.336109" elapsed="0.000219"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:48.336880" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:48.336499" elapsed="0.000408"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:48.338039" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:48.337506" elapsed="0.000687">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:48.338363" elapsed="0.000035"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:48.337092" elapsed="0.001409">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.338677" elapsed="0.000052"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.338884" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.339057" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.339223" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.339401" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.339569" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.339733" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.339903" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.340062" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.340339" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.340583" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.340774" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:48.340211" elapsed="0.000644"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:48.340135" elapsed="0.000750"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.341026" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:48.341086" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:48.335624" elapsed="0.005568">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:48.341260" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:48.325297" elapsed="0.016060">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.341546" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.345707" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.345944" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:48.346012" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:48.316307" elapsed="0.029810">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:48.346231" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:48.346280" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:48.315753" elapsed="0.030551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:48.346565" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:48.346445" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:48.346371" elapsed="0.000262"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:48.347950" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:48.348627" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:48.348308" elapsed="0.000345"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:48.349442" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:48.349166" elapsed="0.000364">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:48.349593" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:48.348833" elapsed="0.000861">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.349865" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.350036" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.350208" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.350374" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.350566" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.350738" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.350901" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.351068" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.351228" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.351651" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.351826" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.351986" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:48.351360" elapsed="0.000679"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:48.351297" elapsed="0.000767"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.352202" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:48.352260" elapsed="0.000047"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:48.347412" elapsed="0.005004">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:48.352529" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:48.352573" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:48.346808" elapsed="0.005788"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:48.353203" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:48.352889" elapsed="0.000375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:48.352676" elapsed="0.000651">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:48.352658" elapsed="0.000701">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:48.353426" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:48.315188" elapsed="0.038338">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.353702" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.353866" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:48.353927" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:48.312762" elapsed="0.041263">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.354191" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.354372" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.354560" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.354746" elapsed="0.000022"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.354915" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:48.355077" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:48.355138" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:48.309895" elapsed="0.045340">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:49.386217" 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-11T00:46:49.385749" elapsed="0.000502"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:49.386823" 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-11T00:46:49.386521" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:49.386900" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:46:49.387070" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:49.385343" elapsed="0.001753"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:49.391886" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:49.391698" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:49.392063" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:49.392627" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:49.392418" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:49.393084" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:49.392832" elapsed="0.000293"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:49.393269" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:49.393817" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:49.393613" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:49.394251" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:49.394011" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:49.394795" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:49.394455" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:49.395223" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:49.394987" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:49.395932" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:49.395461" elapsed="0.000498"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:49.402243" elapsed="0.000226"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:49.410818" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:49.411598" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:49.411182" elapsed="0.000442"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:49.412761" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:49.412202" elapsed="0.000715">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:49.413077" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:49.411809" elapsed="0.001388">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.413375" elapsed="0.000039"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.413568" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.413743" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.413913" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.414077" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.414239" elapsed="0.000054"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.414457" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.414628" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.414788" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.415062" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.415300" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.415513" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:49.414934" elapsed="0.000663"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:49.414860" elapsed="0.000766"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.415770" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:49.415829" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:49.410318" elapsed="0.005617">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:49.416003" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:49.400067" elapsed="0.016035">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.416275" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.420516" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.420710" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:49.420775" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:49.391132" elapsed="0.029748">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:49.420990" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:49.421033" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:49.390376" elapsed="0.030679"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:49.421257" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:49.421141" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:49.421120" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:49.422645" elapsed="0.000239"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:49.423378" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:49.423052" elapsed="0.000368"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:49.424196" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:49.423934" elapsed="0.000386">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:49.424398" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:49.423599" elapsed="0.000907">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.424680" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.424855" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.425029" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.425198" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.425369" elapsed="0.000043"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.425558" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.425723" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.425890" elapsed="0.000161"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.426201" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.426471" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.426644" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.426805" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:49.426330" elapsed="0.000528"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:49.426266" elapsed="0.000618"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.427023" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:49.427082" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:49.422091" elapsed="0.005095">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:49.427321" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:49.427366" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:49.421507" elapsed="0.005896"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:49.428033" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:49.427699" elapsed="0.000395">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:49.427486" elapsed="0.000671">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:49.427467" elapsed="0.000722">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:49.428234" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:49.389834" elapsed="0.038495">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.428520" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.428756" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:49.428822" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:49.387452" elapsed="0.041471">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.429092" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.429267" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.429457" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.429620" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.429784" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:49.429946" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:49.430007" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:49.384565" elapsed="0.045540">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:50.460701" 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-11T00:46:50.460215" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:50.461213" 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-11T00:46:50.460916" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:50.461288" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:46:50.461481" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:50.459797" elapsed="0.001710"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:50.466048" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:50.465859" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:50.466230" elapsed="0.000211"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:50.466800" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:50.466594" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:50.467268" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:50.467015" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:50.467470" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:50.468024" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:50.467798" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:50.468670" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:50.468226" elapsed="0.000486"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:50.469289" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:50.468864" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:50.469739" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:50.469500" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:50.470217" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:50.469932" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:50.476506" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:50.485550" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:50.486279" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:50.485910" elapsed="0.000395"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:50.487439" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:50.486899" elapsed="0.000693">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:50.487753" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:50.486514" elapsed="0.001380">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.488064" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.488234" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.488427" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.488601" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.488762" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.488923" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.489084" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.489255" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.489428" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.489702" elapsed="0.000028"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.489933" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.490123" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:50.489570" elapsed="0.000634"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:50.489500" elapsed="0.000732"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.490372" elapsed="0.000035"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:50.490447" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:50.485051" elapsed="0.005504">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:50.490624" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:50.474317" elapsed="0.016406">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.490936" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.495059" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.495249" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:50.495316" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:50.465309" elapsed="0.030173">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:50.495596" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:50.495640" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:50.464760" elapsed="0.030904"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:50.495884" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:50.495750" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:50.495729" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:50.497238" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:50.497909" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:50.497611" elapsed="0.000324"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:50.498729" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:50.498460" elapsed="0.000495">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:50.499018" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:50.498112" elapsed="0.001008">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.499298" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.499494" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.499671" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.499866" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.500032" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.500193" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.500355" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.500539" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.500700" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.500950" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.501117" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.501276" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:50.500826" elapsed="0.000536"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:50.500763" elapsed="0.000641"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.501546" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:50.501605" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:50.496703" elapsed="0.005005">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:50.501818" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:50.501861" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:50.496097" elapsed="0.005787"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:50.502496" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:50.502171" elapsed="0.000386">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:50.501964" elapsed="0.000655">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:50.501946" elapsed="0.000703">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:50.502693" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:50.464201" elapsed="0.038588">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.502962" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.503124" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:50.503185" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:50.461815" elapsed="0.041469">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.503464" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.503647" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.503816" elapsed="0.000032"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.503988" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.504156" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:50.504317" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:50.504378" elapsed="0.000028"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:50.458980" elapsed="0.045511">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:51.536319" 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-11T00:46:51.535848" elapsed="0.000505"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:51.536862" 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-11T00:46:51.536565" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:51.536938" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:46:51.537111" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:51.535452" elapsed="0.001683"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:51.541689" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:51.541501" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:51.541865" elapsed="0.000186"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:51.542424" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:51.542202" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:51.543053" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:51.542631" elapsed="0.000465"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:51.543246" elapsed="0.000197"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:51.543804" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:51.543597" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:51.544238" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:51.543995" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:51.544813" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:51.544469" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:51.545236" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:51.545003" elapsed="0.000276"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:51.545725" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:51.545443" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:51.551980" elapsed="0.000207"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:51.560456" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:51.561188" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:51.560814" elapsed="0.000400"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:51.562352" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:51.561812" elapsed="0.000716">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:51.562689" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:51.561424" elapsed="0.001383">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.562978" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.563148" elapsed="0.000024"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.563325" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.563522" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.563749" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.563916" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.564079" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.564248" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.564440" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.564711" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.564934" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.565123" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:51.564583" elapsed="0.000621"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:51.564512" elapsed="0.000719"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.565371" elapsed="0.000035"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:51.565447" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:51.559937" elapsed="0.005617">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:51.565621" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:51.549831" elapsed="0.015897">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.565900" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.570158" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.570351" elapsed="0.000025"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:51.570482" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:51.540944" elapsed="0.029644">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:51.570699" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:51.570743" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:51.540379" elapsed="0.030386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:51.570966" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:51.570850" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:51.570830" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:51.572311" elapsed="0.000242"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:51.573044" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:51.572739" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:51.573857" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:51.573597" elapsed="0.000345">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:51.574005" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:51.573248" elapsed="0.000859">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.574282" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.574480" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.574656" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.574828" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.574991" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.575152" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.575315" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.575499" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.575660" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.575912" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.576084" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.576242" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:51.575788" elapsed="0.000506"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:51.575723" elapsed="0.000597"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.576496" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:51.576557" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:51.571778" elapsed="0.004881">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:51.576769" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:51.576812" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:51.571179" elapsed="0.005655"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:51.577460" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:51.577124" elapsed="0.000398">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:51.576915" elapsed="0.000669">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:51.576896" elapsed="0.000719">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:51.577659" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:51.539825" elapsed="0.037939">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.577972" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.578137" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:51.578199" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:51.537446" elapsed="0.040850">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.578477" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.578655" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.578821" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.578979" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.579141" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:51.579301" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:51.579362" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:51.534655" elapsed="0.044820">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:52.612107" 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-11T00:46:52.611630" elapsed="0.000510"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:52.612624" 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-11T00:46:52.612308" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:52.612700" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:46:52.612870" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:52.611236" elapsed="0.001659"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:52.617506" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:52.617303" elapsed="0.000231"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:52.617685" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:52.618230" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:52.618023" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:52.618712" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:52.618458" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:52.618896" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:52.619441" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:52.619222" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:52.619933" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:52.619691" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:52.620474" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:52.620121" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:52.620897" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:52.620664" elapsed="0.000294"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:52.621402" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:52.621107" elapsed="0.000322"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:52.627806" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:52.636304" elapsed="0.000229"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:52.637066" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:52.636688" elapsed="0.000405"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:52.638222" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:52.637694" elapsed="0.000682">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:52.638556" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:52.637275" elapsed="0.001401">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.638850" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.639023" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.639196" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.639363" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.639546" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.639708" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.639869" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.640035" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.640194" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.640484" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.640707" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.640903" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:52.640336" elapsed="0.000678"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:52.640263" elapsed="0.000780"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.641185" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:52.641243" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:52.635811" elapsed="0.005538">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:52.641434" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:52.625641" elapsed="0.015930">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.641748" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.645884" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.646076" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:52.646142" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:52.616741" elapsed="0.029506">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:52.646359" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:52.646460" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:52.616168" elapsed="0.030319"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:52.646691" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:52.646577" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:52.646555" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:52.648031" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:52.648709" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:52.648407" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:52.649571" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:52.649287" elapsed="0.000378">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:52.649727" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:52.648914" elapsed="0.000916">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.650000" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.650170" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.650342" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.650535" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.650703" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.650864" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.651025" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.651192" elapsed="0.001681"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.653068" elapsed="0.000059"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.653373" elapsed="0.000036"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.653564" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.653726" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:52.653243" elapsed="0.000538"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:52.653177" elapsed="0.000630"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.653945" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:52.654006" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:52.647497" elapsed="0.006615">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:52.654224" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:52.654269" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:52.646904" elapsed="0.007389"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:52.654919" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:52.654604" elapsed="0.000377">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:52.654375" elapsed="0.000668">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:52.654357" elapsed="0.000719">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:52.655120" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:52.615617" elapsed="0.039600">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.655406" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.655574" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:52.655637" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:52.613206" elapsed="0.042527">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.655899" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.656076" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.656244" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.656420" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.656586" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:52.656748" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:52.656810" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:52.610468" elapsed="0.046470">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:53.687919" 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-11T00:46:53.687451" elapsed="0.000502"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:53.688437" 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-11T00:46:53.688122" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:53.688512" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:46:53.688681" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:53.687051" elapsed="0.001656"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:53.693489" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:53.693276" elapsed="0.000255"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:53.693683" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:53.694234" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:53.694026" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:53.694711" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:53.694458" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:53.694896" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:53.695445" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:53.695224" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:53.695876" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:53.695637" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:53.696414" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:53.696065" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:53.722364" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:53.696604" elapsed="0.025843"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:53.722986" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:53.722658" elapsed="0.000355"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:53.729400" elapsed="0.000253"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:53.737984" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:53.738795" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:53.738348" elapsed="0.000473"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:53.739957" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:53.739418" elapsed="0.000691">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:53.740273" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:53.739003" elapsed="0.001409">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.740591" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.740831" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.741010" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.741179" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.741346" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.741544" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.741712" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.741882" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.742043" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.742320" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.742561" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.742751" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:53.742189" elapsed="0.000642"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:53.742116" elapsed="0.000743"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.743002" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:53.743061" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:53.737471" elapsed="0.005698">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:53.743237" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:53.727176" elapsed="0.016160">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.743527" elapsed="0.000025"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.747769" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.747961" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:53.748028" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:53.692665" elapsed="0.055471">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:53.748248" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:53.748291" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:53.692097" elapsed="0.056217"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:53.748627" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:53.748491" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:53.748468" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:53.750011" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:53.750688" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:53.750371" elapsed="0.000343"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:53.751504" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:53.751227" elapsed="0.000372">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:53.751660" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:53.750895" elapsed="0.000868">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.751933" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.752104" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.752276" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.752467" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.752634" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.752794" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.752955" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.753129" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.753292" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.753585" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.753758" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.753920" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:53.753433" elapsed="0.000540"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:53.753356" elapsed="0.000643"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.754139" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:53.754198" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:53.749453" elapsed="0.004851">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:53.754429" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:53.754474" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:53.748841" elapsed="0.005656"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:53.755104" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:53.754787" elapsed="0.000377">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:53.754576" elapsed="0.000650">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:53.754558" elapsed="0.000733">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:53.755340" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:53.691552" elapsed="0.063903">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.755632" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.755798" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:53.755859" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:53.689001" elapsed="0.066955">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.756123" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.756298" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.756481" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.756643" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.756807" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:53.756968" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:53.757028" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:53.686274" elapsed="0.070853">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:54.789771" 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-11T00:46:54.789264" elapsed="0.000542"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:54.790293" 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-11T00:46:54.789976" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:54.790368" elapsed="0.000060"/>
</return>
<msg time="2026-04-11T00:46:54.790561" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:54.788877" elapsed="0.001710"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:54.795288" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:54.795097" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:54.795479" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:54.796035" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:54.795826" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:54.796595" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:54.796317" elapsed="0.000320"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:54.796785" elapsed="0.000186"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:54.797331" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:54.797123" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:54.797815" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:54.797555" elapsed="0.000302"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:54.798415" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:54.798013" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:54.798857" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:54.798615" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:54.799349" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:54.799058" elapsed="0.000318"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:54.805868" elapsed="0.000236"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:54.814634" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:54.815379" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:54.815001" elapsed="0.000429"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:54.816562" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:54.816016" elapsed="0.000698">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:54.816879" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:54.815624" elapsed="0.001374">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.817173" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.817345" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.817538" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.817706" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.817885" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.818050" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.818245" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.818432" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.818601" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.818875" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.819101" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.819293" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:54.818746" elapsed="0.000630"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:54.818675" elapsed="0.000747"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.819567" elapsed="0.000057"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:54.819667" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:54.814117" elapsed="0.005660">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:54.819845" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:54.803676" elapsed="0.016271">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.820122" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.824349" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.824603" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:54.824673" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:54.794559" elapsed="0.030223">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:54.824894" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:54.824940" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:54.793952" elapsed="0.031011"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:54.825168" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:54.825052" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:54.825030" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:54.826705" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:54.827406" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:54.827085" elapsed="0.000349"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:54.828238" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:54.827975" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:54.828411" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:54.827632" elapsed="0.000889">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.828710" elapsed="0.000025"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.828898" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.829076" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.829246" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.829470" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.829640" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.829823" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.830000" elapsed="0.000172"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.830324" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.830600" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.830771" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.830930" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:54.830472" elapsed="0.000510"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:54.830405" elapsed="0.000603"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.831146" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:54.831205" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:54.826026" elapsed="0.005286">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:54.831440" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:54.831485" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:54.825428" elapsed="0.006079"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:54.832114" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:54.831799" elapsed="0.000376">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:54.831588" elapsed="0.000650">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:54.831569" elapsed="0.000701">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:54.832315" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:54.793402" elapsed="0.039025">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.832604" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.832767" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:54.832828" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:54.790897" elapsed="0.042028">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.833090" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.833265" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.833458" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.833656" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.833822" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:54.833984" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:54.834045" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:54.788079" elapsed="0.046103">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:55.864128" 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-11T00:46:55.863654" elapsed="0.000508"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:55.864652" 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-11T00:46:55.864332" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:55.864729" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:46:55.864901" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:55.863251" elapsed="0.001675"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:55.869521" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:55.869315" elapsed="0.000232"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:55.869700" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:55.870256" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:55.870046" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:55.870768" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:55.870479" elapsed="0.000332"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:55.870957" elapsed="0.000184"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:55.871701" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:55.871293" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:55.872141" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:55.871896" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:55.872695" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:55.872334" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:55.873124" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:55.872886" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:55.873614" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:55.873315" elapsed="0.000325"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:55.879970" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:55.888493" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:55.889253" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:55.888859" elapsed="0.000419"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:55.890507" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:55.889960" elapsed="0.000712">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:55.890834" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:55.889563" elapsed="0.001390">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.891128" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.891305" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.891499" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.891670" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.891834" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.891997" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.892160" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.892329" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.892505" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.892776" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.892997" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.893186" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:55.892648" elapsed="0.000618"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:55.892576" elapsed="0.000718"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.893453" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:55.893517" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:55.887995" elapsed="0.005632">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:55.893696" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:55.877773" elapsed="0.016022">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.893969" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.898236" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.898483" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:55.898588" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:55.868772" elapsed="0.029951">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:55.898839" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:55.898883" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:55.868198" elapsed="0.030708"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:55.899111" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:55.898994" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:55.898973" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:55.900475" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:55.901134" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:55.900835" elapsed="0.000325"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:55.901956" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:55.901694" elapsed="0.000348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:55.902104" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:55.901338" elapsed="0.000868">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.902376" elapsed="0.000044"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.902572" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.902770" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.902940" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.903105" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.903265" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.903442" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.903613" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.903773" elapsed="0.000026"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.904034" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.904203" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.904362" elapsed="0.000033"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:55.903909" elapsed="0.000521"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:55.903843" elapsed="0.000612"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.904593" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:55.904651" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:55.899926" elapsed="0.004828">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:55.904865" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:55.904945" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:55.899324" elapsed="0.005646"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:55.905606" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:55.905264" elapsed="0.000402">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:55.905053" elapsed="0.000676">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:55.905034" elapsed="0.000727">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:55.905806" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:55.867650" elapsed="0.038253">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.906077" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.906241" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:55.906302" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:55.865221" elapsed="0.041194">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.906584" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.906772" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.906940" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.907099" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.907265" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:55.907441" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:55.907503" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:55.862444" elapsed="0.045157">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:56.937153" 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-11T00:46:56.936672" elapsed="0.000516"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:56.937677" 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-11T00:46:56.937362" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:56.937753" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:46:56.937927" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:56.936269" elapsed="0.001683"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:56.942617" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:56.942426" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:56.942795" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:56.943377" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:56.943138" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:56.943860" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:56.943607" elapsed="0.000293"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:56.944046" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:56.944595" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:56.944375" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:56.945035" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:56.944793" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:56.945591" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:56.945230" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:56.946018" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:56.945783" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:56.946508" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:56.946211" elapsed="0.000323"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:56.952995" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:56.961565" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:56.962308" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:56.961929" elapsed="0.000405"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:56.963541" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:56.962941" elapsed="0.000763">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:56.963867" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:56.962547" elapsed="0.001439">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.964162" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.964335" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.964527" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.964696" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.964866" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.965031" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.965195" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.965363" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.965543" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.965818" elapsed="0.000058"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.966085" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.966277" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:56.965689" elapsed="0.000670"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:56.965616" elapsed="0.000787"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.966550" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:56.966611" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:56.961063" elapsed="0.005657">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:56.966789" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:56.950781" elapsed="0.016108">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.967063" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.971247" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.971497" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:56.971566" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:56.941880" elapsed="0.029792">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:56.971784" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:56.971828" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:56.941305" elapsed="0.030546"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:56.972062" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:56.971940" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:56.971919" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:56.973449" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:56.974125" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:56.973821" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:56.974945" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:56.974684" elapsed="0.000348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:56.975094" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:56.974333" elapsed="0.000864">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.975426" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.975642" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.975840" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.976029" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.976199" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.976362" elapsed="0.000035"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.976551" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.976747" elapsed="0.000183"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.977110" elapsed="0.000025"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.977432" elapsed="0.000026"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.977618" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.977807" elapsed="0.000034"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:56.977262" elapsed="0.000620"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:56.977187" elapsed="0.000722"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.978057" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:56.978117" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:56.972882" elapsed="0.005341">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:56.978334" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:56.978377" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:56.972278" elapsed="0.006146"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:56.979102" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:56.978767" elapsed="0.000397">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:56.978533" elapsed="0.000718">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:56.978509" elapsed="0.000778">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:56.979335" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:56.940761" elapsed="0.038691">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.979629" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.979796" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:56.979858" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:56.938333" elapsed="0.041622">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.980165" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.980344" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.980531" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.980695" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.980869" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:56.981035" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:56.981096" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:56.935470" elapsed="0.045726">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:58.012610" 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-11T00:46:58.012078" elapsed="0.000572"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:58.013121" 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-11T00:46:58.012823" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:58.013196" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:46:58.013366" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:58.011559" elapsed="0.001847"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:58.018140" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:58.017948" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:58.018317" elapsed="0.000206"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:58.018884" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:58.018678" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:58.019355" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:58.019097" elapsed="0.000316"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:58.019560" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:58.020296" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:58.019914" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:58.020749" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:58.020503" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:58.021283" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:58.020941" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:58.021727" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:58.021489" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:58.022196" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:58.021918" elapsed="0.000304"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:58.028795" elapsed="0.000283"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:58.037498" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:58.038240" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:58.037865" elapsed="0.000401"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:58.039408" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:58.038863" elapsed="0.000700">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:58.039726" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:58.038472" elapsed="0.001383">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.040030" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.040205" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.040399" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.040577" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.040743" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.040908" elapsed="0.000025"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.041078" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.041246" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.041421" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.041694" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.041924" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.042128" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:58.041564" elapsed="0.000668"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:58.041492" elapsed="0.000771"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.042428" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:58.042489" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:58.036995" elapsed="0.005607">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:58.042670" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:58.026565" elapsed="0.016204">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.042941" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.047280" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.047591" elapsed="0.000025"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:58.047661" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:58.017325" elapsed="0.030442">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:58.047901" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:58.047945" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:58.016771" elapsed="0.031196"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:58.048175" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:58.048055" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:58.048033" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:58.049543" elapsed="0.000204"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:58.050195" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:58.049898" elapsed="0.000321"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:58.051013" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:58.050755" elapsed="0.000344">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:58.051160" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:58.050420" elapsed="0.000841">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.051442" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.051609" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.051803" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.051972" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.052132" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.052290" elapsed="0.000027"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.052472" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.052647" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.052806" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.053054" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.053221" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.053376" elapsed="0.000035"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:58.052931" elapsed="0.000512"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:58.052868" elapsed="0.000601"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.053605" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:58.053663" elapsed="0.000048"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:58.048994" elapsed="0.004810">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:58.053921" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:58.053964" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:58.048410" elapsed="0.005577"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:58.054611" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:58.054279" elapsed="0.000392">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:58.054066" elapsed="0.000668">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:58.054048" elapsed="0.000717">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:58.054809" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:58.016171" elapsed="0.038733">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.055077" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.055241" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:58.055302" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:58.013703" elapsed="0.041710">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.055582" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.055758" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.055942" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.056104" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.056278" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:58.056457" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:58.056519" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:58.010727" elapsed="0.045891">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:46:59.087453" 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-11T00:46:59.086956" elapsed="0.000531"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:46:59.088026" 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-11T00:46:59.087730" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:46:59.088101" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:46:59.088273" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:46:59.086560" elapsed="0.001737"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:46:59.092989" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:46:59.092796" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:59.093167" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:59.093731" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:59.093523" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:59.094191" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:59.093938" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:46:59.094377" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:59.094924" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:46:59.094722" elapsed="0.000227"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:59.095360" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:59.095116" elapsed="0.000301"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:59.095908" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:59.095569" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:46:59.096344" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:46:59.096098" elapsed="0.000304"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:46:59.096834" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:46:59.096552" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:59.103314" elapsed="0.000235"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:59.111891" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:59.112675" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:59.112256" elapsed="0.000446"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:59.113834" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:59.113275" elapsed="0.000714">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:59.114152" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:59.112885" elapsed="0.001385">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.114471" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.114650" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.114823" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.114990" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.115156" elapsed="0.000025"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.115326" elapsed="0.000070"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.115550" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.115720" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.115883" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.116159" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.116425" elapsed="0.000028"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.116626" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:59.116030" elapsed="0.000678"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:59.115957" elapsed="0.000781"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.116881" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:59.116941" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:59.111401" elapsed="0.005648">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:59.117118" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:46:59.101130" elapsed="0.016088">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.117406" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.121605" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.121799" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:46:59.121865" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:46:59.092196" elapsed="0.029775">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:59.122083" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:59.122126" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:59.091637" elapsed="0.030512"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:59.122357" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:46:59.122237" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-11T00:46:59.122216" elapsed="0.000247"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:46:59.123753" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:46:59.124445" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:46:59.124114" elapsed="0.000357"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:46:59.125248" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:46:59.124987" elapsed="0.000385">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:46:59.125452" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:46:59.124654" elapsed="0.000903">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.125729" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.125899" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.126072" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.126238" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.126425" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.126589" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.126753" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.126921" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.127082" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.127341" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.127527" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.127692" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:46:59.127208" elapsed="0.000537"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:46:59.127146" elapsed="0.000624"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.127909" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:59.127968" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:59.123200" elapsed="0.004872">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:46:59.128181" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:46:59.128225" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:46:59.122614" elapsed="0.005633"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:46:59.129088" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:46:59.128590" elapsed="0.000559">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:46:59.128327" elapsed="0.000886">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:46:59.128309" elapsed="0.000936">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:46:59.129290" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:46:59.091007" elapsed="0.038395">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.129580" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.129785" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:59.129849" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:46:59.088628" elapsed="0.041319">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.130113" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.130289" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.130473" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.130637" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.130804" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:46:59.130966" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:46:59.131026" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:46:59.085661" elapsed="0.045463">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:00.161591" 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-11T00:47:00.161086" elapsed="0.000541"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:00.162100" 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-11T00:47:00.161802" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:00.162176" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:47:00.162351" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:47:00.160682" elapsed="0.001695"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:47:00.167015" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:47:00.166823" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:00.167192" elapsed="0.000201"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:00.167758" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:00.167550" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:00.168219" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:00.167966" elapsed="0.000295"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:00.168423" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:00.168974" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:00.168754" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:00.169459" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:00.169167" elapsed="0.000334"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:00.170075" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:00.169661" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:00.170525" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:00.170270" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:00.171008" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:00.170721" elapsed="0.000314"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:00.177631" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:00.186206" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:00.186962" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:00.186588" elapsed="0.000400"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:00.188109" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:00.187581" elapsed="0.000677">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:00.188435" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:00.187170" elapsed="0.001386">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.188732" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.188930" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.189114" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.189283" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.189464" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.189632" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.189801" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.189972" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.190135" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.190422" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.190647" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.190845" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:00.190279" elapsed="0.000646"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:00.190206" elapsed="0.000748"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.191096" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:00.191156" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:00.185715" elapsed="0.005547">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:00.191330" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:47:00.175424" elapsed="0.016025">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.191672" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.195814" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.196006" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:47:00.196072" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:47:00.166269" elapsed="0.029909">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:00.196289" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:00.196333" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:00.165685" elapsed="0.030671"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:00.196615" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:47:00.196495" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T00:47:00.196474" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:00.198109" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:00.198789" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:00.198486" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:00.199608" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:00.199328" elapsed="0.000367">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:00.199756" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:00.198994" elapsed="0.000865">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.200032" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.200205" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.200405" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.200583" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.200748" elapsed="0.000026"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.200931" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.201096" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.201266" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.201446" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.201704" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.201875" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.202037" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:00.201578" elapsed="0.000550"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:00.201513" elapsed="0.000641"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.202296" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:00.202355" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:00.197555" elapsed="0.004930">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:00.202598" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:00.202642" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:00.196832" elapsed="0.005832"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:00.203479" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:47:00.203133" elapsed="0.000409">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:00.202915" elapsed="0.000690">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:00.202727" elapsed="0.000910">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:00.203683" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:00.165110" elapsed="0.038671">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.203957" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.204122" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:00.204184" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:47:00.162695" elapsed="0.041587">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.204463" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.204643" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.204811" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.204997" elapsed="0.000022"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.205173" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:00.205341" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:00.205424" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:47:00.159898" elapsed="0.045626">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:01.236881" 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-11T00:47:01.236339" elapsed="0.000581"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:01.237423" 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-11T00:47:01.237104" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:01.237518" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:47:01.238156" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:47:01.235931" elapsed="0.002327"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:47:01.249678" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:47:01.249124" elapsed="0.000625"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:01.249936" elapsed="0.000202"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:01.250519" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:01.250293" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:01.251000" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:01.250743" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:01.251186" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:01.251751" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:01.251543" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:01.252193" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:01.251944" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:01.252745" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:01.252402" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:01.253167" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:01.252936" elapsed="0.000277"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:01.253672" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:01.253363" elapsed="0.000335"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:01.260348" elapsed="0.000224"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:01.268894" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:01.269708" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:01.269256" elapsed="0.000479"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:01.270884" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:01.270321" elapsed="0.000731">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:01.271222" elapsed="0.000025"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:01.269922" elapsed="0.001437">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.271555" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.271736" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.271913" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.272083" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.272338" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.272523" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.272690" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.272860" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.273024" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.273318" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.273585" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.273783" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:01.273186" elapsed="0.000682"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:01.273101" elapsed="0.000797"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.274044" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:01.274104" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:01.268408" elapsed="0.005810">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:01.274287" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:47:01.258148" elapsed="0.016253">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.274579" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.278776" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.278972" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:47:01.279038" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:47:01.247890" elapsed="0.031253">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:01.279256" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:01.279299" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:01.246511" elapsed="0.032810"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:01.279603" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:47:01.279463" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-11T00:47:01.279439" elapsed="0.000231"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:01.280954" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:01.281703" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:01.281350" elapsed="0.000380"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:01.282533" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:01.282251" elapsed="0.000368">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:01.282682" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:01.281915" elapsed="0.000871">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.282956" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.283128" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.283301" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.283494" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.283668" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.283837" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.283999" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.284168" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.284328" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.284745" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.284921" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.285082" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:01.284471" elapsed="0.000664"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:01.284406" elapsed="0.000755"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.285298" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:01.285357" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:01.280417" elapsed="0.005074">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:01.285607" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:01.285650" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:01.279820" elapsed="0.005853"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:01.286292" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:47:01.285969" elapsed="0.000392">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:01.285755" elapsed="0.000687">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:01.285736" elapsed="0.000738">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:01.286520" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:01.245087" elapsed="0.041529">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.286829" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.286993" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:01.287055" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:47:01.239217" elapsed="0.047937">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.287320" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.287512" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.287681" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.287841" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.288004" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:01.288166" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:01.288227" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:47:01.235015" elapsed="0.053310">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:02.319377" 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-11T00:47:02.318904" elapsed="0.000525"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:02.319900" 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-11T00:47:02.319603" elapsed="0.000498"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:02.320151" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:47:02.320323" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:47:02.318511" elapsed="0.001836"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:47:02.324901" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:47:02.324709" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:02.325078" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:02.325639" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:02.325431" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:02.326143" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:02.325858" elapsed="0.000327"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:02.326329" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:02.326878" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:02.326675" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:02.327444" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:02.327173" elapsed="0.000313"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:02.328158" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:02.327637" elapsed="0.000548"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:02.328607" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:02.328351" elapsed="0.000301"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:02.329089" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:02.328807" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:02.335473" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:02.344003" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:02.344758" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:02.344369" elapsed="0.000415"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:02.345981" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:02.345416" elapsed="0.000757">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:02.346339" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:02.344969" elapsed="0.001512">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.346658" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.346830" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.347001" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.347166" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.347327" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.347505" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.347666" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.347837" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.347996" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.348269" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.348509" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.348709" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:02.348141" elapsed="0.000648"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:02.348068" elapsed="0.000750"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.348960" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:02.349018" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:02.343522" elapsed="0.005602">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:02.349192" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:47:02.333261" elapsed="0.016070">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.349523" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.353661" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.353855" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:47:02.353921" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:47:02.324161" elapsed="0.029883">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:02.354159" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:02.354201" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:02.323612" elapsed="0.030611"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:02.354480" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:47:02.354310" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-11T00:47:02.354289" elapsed="0.000259"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:02.355825" elapsed="0.000204"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:02.356493" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:02.356179" elapsed="0.000339"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:02.357286" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:02.357025" elapsed="0.000502">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:02.357591" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:02.356694" elapsed="0.001000">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.357872" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.358083" elapsed="0.000024"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.358264" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.358455" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.358621" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.358783" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.358944" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.359109" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.359267" elapsed="0.000052"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.359576" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.359748" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.359904" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:02.359448" elapsed="0.000508"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:02.359367" elapsed="0.000614"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.360117" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:02.360175" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:02.355276" elapsed="0.005003">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:02.360403" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:02.360448" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:02.354696" elapsed="0.005780"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:02.361083" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:47:02.360769" elapsed="0.000374">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:02.360557" elapsed="0.000649">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:02.360539" elapsed="0.000699">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:02.361284" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:02.323053" elapsed="0.038348">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.361577" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.361739" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:02.361800" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:47:02.320656" elapsed="0.041241">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.362079" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.362266" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.362449" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.362614" elapsed="0.000022"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.362782" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:02.362943" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:02.363003" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:47:02.317663" elapsed="0.045473">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:03.392581" 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-11T00:47:03.392051" elapsed="0.000574"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:03.393095" 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-11T00:47:03.392799" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:03.393170" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:47:03.393343" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:47:03.391662" elapsed="0.001706"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:47:03.397929" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:47:03.397737" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:03.398109" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:03.398878" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:03.398464" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:03.399347" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:03.399092" elapsed="0.000312"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:03.399553" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:03.400091" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:03.399885" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:03.400559" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:03.400293" elapsed="0.000308"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:03.401106" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:03.400753" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:03.401551" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:03.401297" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:03.402030" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:03.401746" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:03.408364" elapsed="0.000225"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:03.416850" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:03.417600" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:03.417209" elapsed="0.000417"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:03.418762" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:03.418198" elapsed="0.000718">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:03.419080" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:03.417812" elapsed="0.001386">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.419369" elapsed="0.000043"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.419621" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.419804" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.419972" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.420136" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.420306" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.420490" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.420661" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.420820" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.421088" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.421312" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.421521" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:03.420961" elapsed="0.000641"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:03.420891" elapsed="0.000740"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.421778" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:03.421838" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:03.416350" elapsed="0.005595">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:03.422012" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:47:03.406192" elapsed="0.015918">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.422280" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.426527" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.426736" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:47:03.426801" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:47:03.397187" elapsed="0.029719">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:03.427016" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:03.427058" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:03.396635" elapsed="0.030446"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:03.427320" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:47:03.427202" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T00:47:03.427180" elapsed="0.000241"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:03.428703" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:03.429360" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:03.429062" elapsed="0.000338"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:03.430176" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:03.429915" elapsed="0.000348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:03.430324" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:03.429581" elapsed="0.000866">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.430647" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.430828" elapsed="0.000025"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.431009" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.431174" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.431337" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.431522" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.431685" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.431855" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.432013" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.432263" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.432450" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.432611" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:03.432139" elapsed="0.000523"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:03.432077" elapsed="0.000611"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.432825" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:03.432883" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:03.428155" elapsed="0.004830">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:03.433093" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:03.433135" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:03.427573" elapsed="0.005584"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:03.433817" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:47:03.433489" elapsed="0.000388">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:03.433236" elapsed="0.000703">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:03.433218" elapsed="0.000785">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:03.434050" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:03.396079" elapsed="0.038068">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.434319" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.434498" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:03.434562" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:47:03.393689" elapsed="0.040986">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.434841" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.435017" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.435184" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.435347" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.435526" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:03.435688" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:03.435748" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:47:03.390854" elapsed="0.044992">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:04.469564" 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-11T00:47:04.469074" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:04.470060" 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-11T00:47:04.469768" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:04.470135" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:47:04.470303" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:47:04.468678" elapsed="0.001650"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:47:04.474889" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:47:04.474696" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:04.475069" elapsed="0.000217"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:04.475665" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:04.475454" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:04.476193" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:04.475938" elapsed="0.000306"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:04.476404" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:04.476941" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:04.476736" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:04.477376" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:04.477132" elapsed="0.000302"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:04.477922" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:04.477583" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:04.478345" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:04.478112" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:04.478849" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:04.478557" elapsed="0.000318"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:04.486868" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:04.495446" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:04.496183" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:04.495810" elapsed="0.000399"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:04.497338" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:04.496803" elapsed="0.000711">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:04.497675" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:04.496413" elapsed="0.001383">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.497969" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.498142" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.498316" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.498502" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.498667" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.498827" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.498987" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.499164" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.499328" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.499614" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.499837" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.500027" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:04.499486" elapsed="0.000621"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:04.499413" elapsed="0.000722"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.500276" elapsed="0.000061"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:04.500393" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:04.494913" elapsed="0.005590">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:04.500570" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:47:04.484673" elapsed="0.015995">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.500849" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.505001" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.505196" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:47:04.505262" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:47:04.474139" elapsed="0.031229">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:04.505547" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:04.505590" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:04.473581" elapsed="0.032032"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:04.505826" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:47:04.505701" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-11T00:47:04.505679" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:04.507205" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:04.507888" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:04.507582" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:04.508718" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:04.508445" elapsed="0.000363">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:04.508871" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:04.508094" elapsed="0.000879">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.509143" elapsed="0.000028"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.509329" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.509527" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.509697" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.509899" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.510065" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.510228" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.510410" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.510576" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.510837" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.511009" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.511202" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:04.510709" elapsed="0.000547"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:04.510642" elapsed="0.000640"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.511435" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:04.511496" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:04.506650" elapsed="0.004948">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:04.511708" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:04.511750" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:04.506040" elapsed="0.005733"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:04.512562" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:47:04.512062" elapsed="0.000561">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:04.511853" elapsed="0.000833">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:04.511835" elapsed="0.000883">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:04.512763" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:04.473023" elapsed="0.039836">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.513033" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.513198" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:04.513260" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:47:04.470636" elapsed="0.042722">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.513546" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.513725" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.513893" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.514090" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.514257" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:04.514436" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:04.514499" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:47:04.467864" elapsed="0.046734">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:05.544922" 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-11T00:47:05.544447" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:05.545438" 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-11T00:47:05.545127" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:05.545514" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:47:05.545685" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:47:05.544048" elapsed="0.001662"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:47:05.550604" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:47:05.550414" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:05.550807" elapsed="0.000210"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:05.551401" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:05.551177" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:05.551886" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:05.551616" elapsed="0.000312"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:05.552074" elapsed="0.000184"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:05.552719" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:05.552503" elapsed="0.000242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:05.553178" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:05.552912" elapsed="0.000308"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:05.553750" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:05.553372" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:05.554181" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:05.553948" elapsed="0.000276"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:05.554667" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:05.554372" elapsed="0.000321"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:05.561206" elapsed="0.000225"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:05.570056" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:05.570842" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:05.570452" elapsed="0.000417"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:05.572106" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:05.571535" elapsed="0.000734">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:05.572450" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:05.571115" elapsed="0.001458">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.572749" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.572927" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.573102" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.573272" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.573455" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.573622" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.573787" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.573956" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.574117" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.574409" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.574646" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.574843" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:05.574258" elapsed="0.000667"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:05.574186" elapsed="0.000767"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.575095" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:05.575155" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:05.569560" elapsed="0.005703">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:05.575333" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:47:05.558994" elapsed="0.016456">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.575628" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.579831" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.580026" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:47:05.580130" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:47:05.549853" elapsed="0.030384">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:05.580350" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:05.580449" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:05.549194" elapsed="0.031281"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:05.580699" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:47:05.580568" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T00:47:05.580546" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:05.582062" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:05.582743" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:05.582439" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:05.583562" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:05.583283" elapsed="0.000367">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:05.583724" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:05.582948" elapsed="0.000880">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.583999" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.584169" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.584341" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.584543" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.584707" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.584868" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.585029" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.585195" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.585355" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.585627" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.585798" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.585960" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:05.585501" elapsed="0.000510"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:05.585435" elapsed="0.000602"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.586173" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:05.586231" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:05.581520" elapsed="0.004816">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:05.586461" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:05.586543" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:05.580916" elapsed="0.005652"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:05.587355" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:47:05.586861" elapsed="0.000571">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:05.586649" elapsed="0.000848">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:05.586631" elapsed="0.000899">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:05.587576" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:05.548580" elapsed="0.039092">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.587881" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.588048" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:05.588110" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:47:05.546007" elapsed="0.042200">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.588373" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.588564" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.588733" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.588893" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.589059" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:05.589222" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:05.589282" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:47:05.543225" elapsed="0.046168">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:06.620123" 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-11T00:47:06.619664" elapsed="0.000493"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:06.620655" 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-11T00:47:06.620341" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:06.620729" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:47:06.620898" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:47:06.619267" elapsed="0.001656"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:47:06.625611" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:47:06.625423" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:06.625788" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:06.626344" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:06.626136" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:06.626821" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:06.626568" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:06.627008" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:06.627556" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:06.627337" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:06.627991" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:06.627749" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:06.628550" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:06.628182" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:06.628975" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:06.628741" elapsed="0.000277"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:06.629462" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:06.629165" elapsed="0.000323"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:06.636061" elapsed="0.000226"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:06.644755" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:06.645521" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:06.645118" elapsed="0.000430"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:06.646668" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:06.646125" elapsed="0.000696">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:06.646985" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:06.645732" elapsed="0.001374">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.647279" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.647470" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.647648" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.647816" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.647979" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.648143" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.648324" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.648508" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.648671" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.648947" elapsed="0.033275"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.682763" elapsed="0.000050"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.683206" elapsed="0.000047"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:06.648814" elapsed="0.034601"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:06.648742" elapsed="0.034740"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.683802" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:06.683936" elapsed="0.000034"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:06.644233" elapsed="0.039946">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:06.684366" elapsed="0.000073"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:47:06.633833" elapsed="0.050804">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.685027" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.693581" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.693776" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:47:06.693843" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:47:06.624868" elapsed="0.069081">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:06.694060" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:06.694103" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:06.624276" elapsed="0.069850"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:06.694332" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:47:06.694214" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T00:47:06.694193" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:06.695715" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:06.696406" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:06.696076" elapsed="0.000357"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:06.697213" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:06.696950" elapsed="0.000349">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:06.697361" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:06.696614" elapsed="0.000868">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.697654" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.697863" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.698040" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.698210" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.698377" elapsed="0.000035"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.698559" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.698723" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.698893" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.699055" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.699468" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.699646" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.699809" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:06.699184" elapsed="0.000679"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:06.699119" elapsed="0.000770"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.700030" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:06.700089" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:06.695157" elapsed="0.005038">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:06.700332" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:06.700378" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:06.694565" elapsed="0.005857"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:06.701034" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:47:06.700718" elapsed="0.000377">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:06.700504" elapsed="0.000655">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:06.700486" elapsed="0.000705">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:06.701237" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:06.623710" elapsed="0.077626">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.701527" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.701692" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:06.701754" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:47:06.621315" elapsed="0.080541">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.702061" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.702240" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.702430" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.702595" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.702767" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:06.702934" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:06.702995" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:47:06.618506" elapsed="0.084589">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:07.734409" 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-11T00:47:07.733914" elapsed="0.000531"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:07.734922" 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-11T00:47:07.734622" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:07.734999" elapsed="0.000045"/>
</return>
<msg time="2026-04-11T00:47:07.735176" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:47:07.733506" elapsed="0.001694"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:47:07.739811" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:47:07.739621" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:07.739989" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:07.740564" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:07.740332" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:07.741076" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:07.740781" elapsed="0.000337"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:07.741264" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:07.741816" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:07.741611" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:07.742257" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:07.742012" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:07.743004" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:07.742464" elapsed="0.000568"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:07.743460" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:07.743201" elapsed="0.000305"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:07.743945" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:07.743657" elapsed="0.000315"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:07.750275" elapsed="0.000301"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:07.759252" elapsed="0.000241"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:07.760036" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:07.759650" elapsed="0.000414"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:07.761252" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:07.760677" elapsed="0.000788">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:07.761635" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:07.760250" elapsed="0.001513">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.761936" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.762110" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.762284" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.762469" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.762634" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.762795" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.762957" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.763125" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.763285" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.763587" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.763814" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.764010" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:07.763457" elapsed="0.000632"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:07.763365" elapsed="0.000762"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.764268" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:07.764327" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:07.758720" elapsed="0.005730">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:07.764520" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:47:07.748085" elapsed="0.016535">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.764793" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.768966" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.769222" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:47:07.769289" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:47:07.739062" elapsed="0.030359">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:07.769541" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:07.769586" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:07.738509" elapsed="0.031099"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:07.769837" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:47:07.769703" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-11T00:47:07.769680" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:07.771222" elapsed="0.000219"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:07.771897" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:07.771593" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:07.772717" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:07.772449" elapsed="0.000360">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:07.772899" elapsed="0.000172"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:07.772101" elapsed="0.001062">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.773337" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.773525" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.773700" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.773868" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.774032" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.774195" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.774357" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.774549" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.774713" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.774971" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.775139" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.775296" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:07.774845" elapsed="0.000503"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:07.774778" elapsed="0.000596"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.775528" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:07.775587" elapsed="0.000052"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:07.770685" elapsed="0.005053">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:07.775852" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:07.775896" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:07.770052" elapsed="0.005867"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:07.776578" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:47:07.776229" elapsed="0.000411">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:07.776003" elapsed="0.000701">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:07.775982" elapsed="0.000755">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:07.776782" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:07.737949" elapsed="0.038963">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.777098" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.777264" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:07.777326" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:47:07.735514" elapsed="0.041926">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.777613" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.777788" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.777958" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.778120" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.778290" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:07.778467" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:07.778531" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:47:07.732608" elapsed="0.046024">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:08.809690" 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-11T00:47:08.809155" elapsed="0.000571"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:08.810295" 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-11T00:47:08.809989" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:08.810372" elapsed="0.000062"/>
</return>
<msg time="2026-04-11T00:47:08.810570" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:47:08.808770" elapsed="0.001825"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:47:08.815611" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:47:08.815414" elapsed="0.000223"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:08.815790" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:08.816345" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:08.816133" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:08.817012" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:08.816570" elapsed="0.000486"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:08.817206" elapsed="0.000229"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:08.817825" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:08.817608" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:08.818276" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:08.818027" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:08.818844" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:08.818490" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:08.819312" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:08.819072" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:08.819857" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:08.819527" elapsed="0.000357"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:08.826318" elapsed="0.000229"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:08.835017" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:08.835785" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:08.835405" elapsed="0.000406"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:08.837028" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:08.836478" elapsed="0.000726">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:08.837374" elapsed="0.000075"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:08.836035" elapsed="0.001524">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.837742" elapsed="0.000030"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.837932" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.838110" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.838347" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.838598" elapsed="0.000035"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.838808" elapsed="0.000083"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.839067" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.839243" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.839425" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.839707" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.839938" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.840130" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:08.839577" elapsed="0.000636"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:08.839500" elapsed="0.000743"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.840399" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:08.840461" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:08.834491" elapsed="0.006079">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:08.840639" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:47:08.824105" elapsed="0.016657">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.840984" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.845461" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.845661" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:47:08.845729" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:47:08.814850" elapsed="0.031001">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:08.845974" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:08.846018" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:08.814223" elapsed="0.031817"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:08.846262" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:47:08.846132" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T00:47:08.846110" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:08.847671" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:08.848343" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:08.848043" elapsed="0.000325"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:08.849161" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:08.848896" elapsed="0.000387">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:08.849347" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:08.848564" elapsed="0.000936">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.849676" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.849848" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.850024" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.850190" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.850351" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.850529" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.850690" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.850856" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.851017" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.851271" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.851455" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.851617" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:08.851145" elapsed="0.000525"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:08.851081" elapsed="0.000614"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.851833" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:08.851891" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:08.847091" elapsed="0.004903">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:08.852110" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:08.852154" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:08.846496" elapsed="0.005680"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:08.852810" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:47:08.852489" elapsed="0.000382">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:08.852255" elapsed="0.000679">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:08.852237" elapsed="0.000729">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:08.853010" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:08.813553" elapsed="0.039552">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.853278" elapsed="0.000028"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.853530" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:08.853603" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:47:08.810929" elapsed="0.042778">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.853873" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.854047" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.854213" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.854414" elapsed="0.000022"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.854592" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:08.854758" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:08.854821" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:47:08.807962" elapsed="0.046958">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.889307" 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-11T00:47:09.888802" elapsed="0.000548"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.889840" 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-11T00:47:09.889543" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:09.889916" elapsed="0.000060"/>
</return>
<msg time="2026-04-11T00:47:09.890111" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:47:09.888410" elapsed="0.001725"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:47:09.894747" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:47:09.894550" elapsed="0.000223"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:09.894925" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:09.895490" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:09.895265" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.895960" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:09.895700" elapsed="0.000302"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:47:09.896149" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:09.896701" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:47:09.896494" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.897219" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:09.896895" elapsed="0.000387"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.898072" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:09.897503" elapsed="0.000607"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.898670" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:09.898335" elapsed="0.000400"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.899311" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:09.898937" elapsed="0.000408"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:09.906516" elapsed="0.000216"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:09.915110" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.915866" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:09.915489" elapsed="0.000404"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:09.917021" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.916489" elapsed="0.000701">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.917352" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.916077" elapsed="0.001417">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.917668" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.917840" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.918054" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.918229" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.918410" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.918578" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.918743" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.918940" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.919114" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.919421" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.919663" elapsed="0.000033"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.919876" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:09.919270" elapsed="0.000693"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.919195" elapsed="0.000798"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.920136" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.920195" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.914613" elapsed="0.005697">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.920377" elapsed="0.000032"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.904281" elapsed="0.016215">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.920713" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.924892" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.925086" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.925154" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.893999" elapsed="0.031261">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:09.925372" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:09.925471" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:09.893423" elapsed="0.032077"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.925712" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:47:09.925591" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-11T00:47:09.925570" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:09.927146" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.927826" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:47:09.927527" elapsed="0.000325"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:47:09.928655" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.928376" elapsed="0.000366">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.928803" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.928036" elapsed="0.000871">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.929077" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.929246" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.929464" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.929639" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.929803" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.929986" elapsed="0.000029"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.930214" elapsed="0.000033"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.930440" elapsed="0.001911"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.932529" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.932793" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.932966" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.933127" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:47:09.932664" elapsed="0.000551"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.932598" elapsed="0.000645"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.933397" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.933459" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.926585" elapsed="0.006988">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:47:09.933689" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:47:09.933734" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:47:09.925937" elapsed="0.007821"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.934496" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.934136" elapsed="0.000426">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:09.933841" elapsed="0.000788">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:09.933821" elapsed="0.000843">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.934713" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.892865" elapsed="0.041955">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.935001" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.935167" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.935231" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:47:09.890463" elapsed="0.044867">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.935516" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.935696" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.935867" elapsed="0.000027"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.936036" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.936203" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.936368" elapsed="0.000035"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.936447" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.887567" elapsed="0.048980">Could not parse owner and candidates for device openflow:1</status>
</kw>
<msg time="2026-04-11T00:47:09.936700" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.687564" elapsed="30.249231">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.936873" elapsed="0.000016"/>
</return>
<var>${original_owner}</var>
<var>${original_successor_list}</var>
<arg>openflow:1</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.685326" elapsed="30.251652">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${original_successor}</var>
<arg>${original_successor_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.937158" elapsed="0.000022"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.937341" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_successor_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.937531" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_successor}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.937703" elapsed="0.000020"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor for first switch s1.</doc>
<status status="FAIL" start="2026-04-11T00:46:39.677629" elapsed="30.260250">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</test>
<test id="s1-s1-t4" name="Reconnect Extra Switches To Successors And Check OVS Connections" line="39">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.939421" level="INFO">${controller_opt} = </msg>
<var>${controller_opt}</var>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:09.939136" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<var>${controller_opt}</var>
<arg>${controller_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ODL_OF_PORT}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.942336" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${controller_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.942545" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:09.942205" elapsed="0.000391"/>
</iter>
<msg time="2026-04-11T00:47:09.942627" level="FAIL">Variable '@{original_successor_list}' not found.</msg>
<var>${index}</var>
<value>@{original_successor_list}</value>
<status status="FAIL" start="2026-04-11T00:47:09.939503" elapsed="0.003159">Variable '@{original_successor_list}' not found.</status>
</for>
<kw name="Set Controller In OVS Bridge" owner="OVSDB">
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>s2</arg>
<arg>${controller_opt}</arg>
<doc>Sets controller for the OVS bridge ${bridge} using  and OF version ${ofversion}.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.952276" elapsed="0.000027"/>
</kw>
<kw name="Set Controller In OVS Bridge" owner="OVSDB">
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>s3</arg>
<arg>${controller_opt}</arg>
<doc>Sets controller for the OVS bridge ${bridge} using  and OF version ${ofversion}.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.959408" elapsed="0.000027"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>OVSDB.Check OVS OpenFlow Connections</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>7</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.959600" elapsed="0.000021"/>
</kw>
<doc>Connect switches s2 and s3 to successor instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.938564" elapsed="0.021195">Variable '@{original_successor_list}' not found.</status>
</test>
<test id="s1-s1-t5" name="Check Network Operational Information Before Fail" line="52">
<kw name="Check OpenFlow Network Operational Information For Sample Topology" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.966499" level="INFO">${dictionary} = {'openflow:1': '4', 'openflow:2': '5', 'openflow:3': '5'}</msg>
<var>${dictionary}</var>
<arg>openflow:1=4</arg>
<arg>openflow:2=5</arg>
<arg>openflow:3=5</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:47:09.966132" elapsed="0.000395"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.972521" 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-11T00:47:09.972119" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.972992" 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-11T00:47:09.972708" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:09.973062" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:47:09.973217" 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-11T00:47:09.971751" elapsed="0.001490"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.977604" elapsed="0.000028"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.977921" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:09.973427" elapsed="0.004555"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.973291" elapsed="0.004728"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'openflow:1': '4', 'openflow:2': '5', 'openflow:3': '5'}.</doc>
<status status="PASS" start="2026-04-11T00:47:09.971192" elapsed="0.006887"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:47:09.966714" elapsed="0.011417"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.978666" level="INFO">${dictionary} = {'openflow:1': '21', 'openflow:2': '19', 'openflow:3': '19'}</msg>
<var>${dictionary}</var>
<arg>openflow:1=21</arg>
<arg>openflow:2=19</arg>
<arg>openflow:3=19</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:47:09.978317" elapsed="0.000376"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.984617" 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-11T00:47:09.984228" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:09.985082" 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-11T00:47:09.984801" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:09.985151" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:09.985302" 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-11T00:47:09.983857" elapsed="0.001469"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.989521" elapsed="0.000027"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:09.989766" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:09.985513" elapsed="0.004311"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:09.985377" elapsed="0.004474"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'openflow:1': '21', 'openflow:2': '19', 'openflow:3': '19'}.</doc>
<status status="PASS" start="2026-04-11T00:47:09.983296" elapsed="0.006610"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:47:09.978877" elapsed="0.011080"/>
</kw>
<doc>Check devices in tree,2 are in operational inventory and topology in all instances in ${controller_index_list}.
Inventory should show 1x node_id per device 1x node_id per connector. Topology should show 2x node_id per device + 3x node_id per connector
+ 5x node_id per link termination. TODO: A Keyword that can calculate this based on mininet topology.</doc>
<status status="PASS" start="2026-04-11T00:47:09.964140" elapsed="0.025921"/>
</kw>
<doc>Check devices in operational inventory and topology in all cluster instances.</doc>
<status status="PASS" start="2026-04-11T00:47:09.959947" elapsed="0.030220"/>
</test>
<test id="s1-s1-t6" name="Add Configuration In Owner and Verify Before Fail" line="56">
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.002834" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.999025" elapsed="0.003850">Variable '${original_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:09.990349" elapsed="0.012663">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-t7" name="Modify Configuration In Owner and Verify Before Fail" line="60">
<kw name="Modify Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.015338" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.011520" elapsed="0.003858">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.003313" elapsed="0.012212">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-t8" name="Delete Configuration In Owner and Verify Before Fail" line="64">
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.020335" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.016297" elapsed="0.004077">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.015713" elapsed="0.004813">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-t9" name="Add Configuration In Successor and Verify Before Fail" line="68">
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.032662" level="FAIL">Variable '${original_successor}' not found.</msg>
<arg>${original_successor}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.028791" elapsed="0.003944">Variable '${original_successor}' not found.</status>
</kw>
<doc>Add Flow in Successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.020716" elapsed="0.012156">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s1-t10" name="Modify Configuration In Successor and Verify Before Fail" line="72">
<kw name="Modify Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.045049" level="FAIL">Variable '${original_successor}' not found.</msg>
<arg>${original_successor}</arg>
<doc>Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.041172" elapsed="0.003915">Variable '${original_successor}' not found.</status>
</kw>
<doc>Modify Flow in successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.033048" elapsed="0.012167">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s1-t11" name="Delete Configuration In Successor and Verify Before Fail" line="76">
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.049831" level="FAIL">Variable '${original_successor}' not found.</msg>
<arg>${original_successor}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.045957" elapsed="0.003911">Variable '${original_successor}' not found.</status>
</kw>
<doc>Delete Flow in Successor and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.045404" elapsed="0.004595">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s1-t12" name="Send RPC Add to Owner and Verify Before Fail" line="80">
<kw name="Send RPC Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.062237" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.058461" elapsed="0.003814">Variable '${original_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.050185" elapsed="0.012239">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-t13" name="Send RPC Delete to Owner and Verify Before Fail" line="84">
<kw name="Send RPC Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.076928" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.073143" elapsed="0.003824">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.062601" elapsed="0.014494">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-t14" name="Send RPC Add to Successor and Verify Before Fail" line="88">
<kw name="Send RPC Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.089226" level="FAIL">Variable '${original_successor}' not found.</msg>
<arg>${original_successor}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.085317" elapsed="0.003948">Variable '${original_successor}' not found.</status>
</kw>
<doc>Add Flow in Successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.077270" elapsed="0.012134">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s1-t15" name="Send RPC Delete to Successor and Verify Before Fail" line="92">
<kw name="Send RPC Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.101424" level="FAIL">Variable '${original_successor}' not found.</msg>
<arg>${original_successor}</arg>
<doc>Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.097575" elapsed="0.003886">Variable '${original_successor}' not found.</status>
</kw>
<doc>Delete Flow in Successor and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.089580" elapsed="0.012006">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s1-t16" name="Modify Network And Verify Before Fail" line="96">
<kw name="Take OpenFlow Device Link Down and Verify" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.108265" level="INFO">${dictionary} = {'"link-down":true': '1'}</msg>
<var>${dictionary}</var>
<arg>"link-down":true=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:47:10.107940" elapsed="0.000353"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<msg time="2026-04-11T00:47:10.118901" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<var>${ouput}</var>
<arg>${mininet_conn_id}</arg>
<arg>link s1 s2 down</arg>
<doc>Sends Command ${cmd} to Mininet session ${mininet_conn} and returns read buffer response.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.115138" elapsed="0.003801">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${operational_port_1}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:10.119137" elapsed="0.000022"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>${dictionary}</var>
<arg>openflow:1=16</arg>
<arg>openflow:2=14</arg>
<arg>openflow:3=19</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:10.119342" elapsed="0.000021"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>20s</arg>
<arg>2s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:10.119556" elapsed="0.000020"/>
</kw>
<doc>Take a link down and verify port status in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.105918" elapsed="0.013760">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Take a link down and verify port status in all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.101760" elapsed="0.018039">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s1-t17" name="Restore Network And Verify Before Fail" line="100">
<kw name="Take OpenFlow Device Link Up and Verify" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.126731" level="INFO">${dictionary} = {'"link-down":true': '0'}</msg>
<var>${dictionary}</var>
<arg>"link-down":true=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:47:10.126421" elapsed="0.000338"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<msg time="2026-04-11T00:47:10.137539" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<var>${ouput}</var>
<arg>${mininet_conn_id}</arg>
<arg>link s1 s2 up</arg>
<doc>Sends Command ${cmd} to Mininet session ${mininet_conn} and returns read buffer response.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.133728" elapsed="0.003850">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${operational_port_1}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:10.137773" elapsed="0.000021"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>${dictionary}</var>
<arg>openflow:1=21</arg>
<arg>openflow:2=19</arg>
<arg>openflow:3=19</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:10.137978" elapsed="0.000021"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:10.138201" elapsed="0.000021"/>
</kw>
<doc>Take the link up and verify port status in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.124402" elapsed="0.013921">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Take the link up and verify port status in all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.119976" elapsed="0.018487">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s1-t18" name="Kill Owner Instance" line="104">
<kw name="Kill_Single_Member" owner="ClusterManagement">
<msg time="2026-04-11T00:47:10.142900" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Convenience keyword that kills the specified member of the cluster.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member}</doc>
<status status="FAIL" start="2026-04-11T00:47:10.139099" elapsed="0.003839">Variable '${original_owner}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_cluster_list}</arg>
<arg>${original_successor_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:10.143114" elapsed="0.000022"/>
</kw>
<doc>Kill Owner Instance and verify it is dead</doc>
<status status="FAIL" start="2026-04-11T00:47:10.138641" elapsed="0.004617">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-t19" name="Check Shards Status After Fail" line="109">
<kw name="Check OpenFlow Shards Status After Cluster Event" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.147791" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Check Shards Status after some cluster event.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.143954" elapsed="0.003875">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Create original cluster list and check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.143450" elapsed="0.004504">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-t20" name="Check Entity Owner Status And Find Owner and Successor After Fail" line="113">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.160058" level="FAIL">Variable '${original_successor}' not found.</msg>
<var>${new_owner}</var>
<var>${new_successor_list}</var>
<arg>openflow:1</arg>
<arg>${original_successor}</arg>
<arg>${new_cluster_list}</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.156125" elapsed="0.003973">Variable '${original_successor}' not found.</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${new_successor}</var>
<arg>${new_successor_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:10.160281" elapsed="0.000022"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:10.160480" elapsed="0.000022"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_successor}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:10.160652" elapsed="0.000019"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.148130" elapsed="0.012661">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s1-t21" name="Check Network Operational Information After Fail" line="123">
<kw name="Check OpenFlow Network Operational Information For Sample Topology" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.169185" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Check devices in tree,2 are in operational inventory and topology in all instances in ${controller_index_list}.
Inventory should show 1x node_id per device 1x node_id per connector. Topology should show 2x node_id per device + 3x node_id per connector
+ 5x node_id per link termination. TODO: A Keyword that can calculate this based on mininet topology.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.165362" elapsed="0.003860">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Check devices in operational inventory and topology in all cluster instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.160969" elapsed="0.008380">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-t22" name="Add Configuration In Owner and Verify After Fail" line="127">
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.181111" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.177564" elapsed="0.003584">Variable '${new_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.169537" elapsed="0.011739">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-t23" name="Modify Configuration In Owner and Verify After Fail" line="131">
<kw name="Modify Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.193184" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.189653" elapsed="0.003568">Variable '${new_owner}' not found.</status>
</kw>
<doc>Modify Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.181467" elapsed="0.011881">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-t24" name="Delete Configuration In Owner and Verify After Fail" line="135">
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.197652" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.194064" elapsed="0.003626">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.193538" elapsed="0.004279">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-t25" name="Add Configuration In Successor and Verify After Fail" line="139">
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.209799" level="FAIL">Variable '${new_successor}' not found.</msg>
<arg>${new_successor}</arg>
<arg>${new_cluster_list}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.206000" elapsed="0.003837">Variable '${new_successor}' not found.</status>
</kw>
<doc>Add Flow in Successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.197990" elapsed="0.011978">Variable '${new_successor}' not found.</status>
</test>
<test id="s1-s1-t26" name="Modify Configuration In Successor and Verify After Fail" line="143">
<kw name="Modify Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.222227" level="FAIL">Variable '${new_successor}' not found.</msg>
<arg>${new_successor}</arg>
<arg>${new_cluster_list}</arg>
<doc>Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.218474" elapsed="0.003792">Variable '${new_successor}' not found.</status>
</kw>
<doc>Modify Flow in Successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.210168" elapsed="0.012240">Variable '${new_successor}' not found.</status>
</test>
<test id="s1-s1-t27" name="Delete Configuration In Successor and Verify After Fail" line="147">
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.226916" level="FAIL">Variable '${new_successor}' not found.</msg>
<arg>${new_successor}</arg>
<arg>${new_cluster_list}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.223123" elapsed="0.003830">Variable '${new_successor}' not found.</status>
</kw>
<doc>Delete Flow in Successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.222584" elapsed="0.004497">Variable '${new_successor}' not found.</status>
</test>
<test id="s1-s1-t28" name="Send RPC Add to Owner and Verify After Fail" line="151">
<kw name="Send RPC Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.238893" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.235317" elapsed="0.003622">Variable '${new_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.227253" elapsed="0.011815">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-t29" name="Send RPC Delete to Owner and Verify After Fail" line="155">
<kw name="Send RPC Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.250939" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.247267" elapsed="0.003716">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.239244" elapsed="0.011876">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-t30" name="Send RPC Add to Successor and Verify After Fail" line="159">
<kw name="Send RPC Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.263185" level="FAIL">Variable '${new_successor}' not found.</msg>
<arg>${new_successor}</arg>
<arg>${new_cluster_list}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.259426" elapsed="0.003796">Variable '${new_successor}' not found.</status>
</kw>
<doc>Add Flow in Successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.251308" elapsed="0.012042">Variable '${new_successor}' not found.</status>
</test>
<test id="s1-s1-t31" name="Send RPC Delete to Successor and Verify After Fail" line="163">
<kw name="Send RPC Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.275495" level="FAIL">Variable '${new_successor}' not found.</msg>
<arg>${new_successor}</arg>
<arg>${new_cluster_list}</arg>
<doc>Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.271713" elapsed="0.003820">Variable '${new_successor}' not found.</status>
</kw>
<doc>Delete Flow in Successor and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.263541" elapsed="0.012120">Variable '${new_successor}' not found.</status>
</test>
<test id="s1-s1-t32" name="Modify Network and Verify After Fail" line="167">
<kw name="Take OpenFlow Device Link Down and Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.283744" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Take a link down and verify port status in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.279950" elapsed="0.003831">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Take a link down and verify port status in all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.275834" elapsed="0.008071">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-t33" name="Restore Network and Verify After Fail" line="171">
<kw name="Take OpenFlow Device Link Up and Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:47:10.292013" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Take the link up and verify port status in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.288210" elapsed="0.003840">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Take the link up and verify port status in all instances.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.284082" elapsed="0.008100">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-t34" name="Start Old Owner Instance" line="175">
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-04-11T00:47:10.296591" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.292828" elapsed="0.003799">Variable '${original_owner}' not found.</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.301262" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:47:10.297417" elapsed="0.003873"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-11T00:47:10.301600" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:47:10.301441" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-11T00:47:10.301416" elapsed="0.000254"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:47:10.301854" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-11T00:47:10.302629" elapsed="0.000467"/>
</kw>
<msg time="2026-04-11T00:47:10.303186" level="INFO">${match} = True</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T00:47:10.302245" elapsed="0.000966"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.303732" level="INFO">${bug_url} = https://jira.opendaylight.org/browse/CONTROLLER-1849</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:47:10.303395" elapsed="0.000364"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.304211" level="INFO">${msg} = This test fails due to https://jira.opendaylight.org/browse/CONTROLLER-1849</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:47:10.303922" elapsed="0.000315"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.304716" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:47:10.304418" elapsed="0.000330"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.305278" level="INFO">Set test message to:
This test fails due to https://jira.opendaylight.org/browse/CONTROLLER-1849

Variable '${original_owner}' not found.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-11T00:47:10.304907" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.305743" level="INFO">This test fails due to https://jira.opendaylight.org/browse/CONTROLLER-1849</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:10.305502" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.306473" level="INFO">Set tag 'https://jira.opendaylight.org/browse/CONTROLLER-1849'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-04-11T00:47:10.306090" elapsed="0.000430"/>
</kw>
<status status="PASS" start="2026-04-11T00:47:10.305855" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-04-11T00:47:10.305836" elapsed="0.000742"/>
</if>
<arg>CONTROLLER-1849</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-11T00:47:10.297032" elapsed="0.009593"/>
</kw>
<doc>Start old Owner Instance and verify it is up</doc>
<tag>https://jira.opendaylight.org/browse/CONTROLLER-1849</tag>
<status status="FAIL" start="2026-04-11T00:47:10.292357" elapsed="0.014312">This test fails due to https://jira.opendaylight.org/browse/CONTROLLER-1849

Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-t35" name="Check Shards Status After Recover" line="180">
<kw name="Check OpenFlow Shards Status After Cluster Event" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:10.328151" elapsed="0.000213"/>
</kw>
<msg time="2026-04-11T00:47:10.328428" 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-11T00:47:10.327530" elapsed="0.000952"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:10.327049" elapsed="0.001516"/>
</kw>
<msg time="2026-04-11T00:47:10.328610" 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-11T00:47:10.318904" elapsed="0.009749"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:10.318509" elapsed="0.010215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.329146" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:10.328899" elapsed="0.000290"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:10.334327" 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-11T00:47:10.333927" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.334814" 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-11T00:47:10.334529" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:10.334924" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:47:10.335080" 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-11T00:47:10.333562" elapsed="0.001543"/>
</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-11T00:47:10.335255" elapsed="0.000181"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.335937" level="INFO">${ds_type} = operational</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-11T00:47:10.335606" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.336355" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:10.336118" elapsed="0.000277"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.336783" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:10.336545" 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-11T00:47:10.337199" 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-11T00:47:10.337456" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:10.337299" 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-11T00:47:10.337681" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:10.337536" elapsed="0.000197"/>
</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-11T00:47:10.337894" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:10.337756" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:10.337282" elapsed="0.000684"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:10.337036" elapsed="0.000952"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:10.336855" elapsed="0.001159"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:10.338053" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:10.338283" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:10.338328" 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-11T00:47:10.332847" elapsed="0.005504"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.338804" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:10.338879" 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-11T00:47:10.338541" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:10.339461" 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-11T00:47:10.339180" elapsed="0.000350">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:10.338969" elapsed="0.000622">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:10.338951" elapsed="0.000671">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-11T00:47:10.339771" 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-11T00:47:10.339940" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:10.340004" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:10.330356" elapsed="0.009754">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:10.329951" elapsed="0.010228">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:10.329811" elapsed="0.010423">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.329425" elapsed="0.010896">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:10.340563" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.309928" elapsed="0.030788">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:11.360058" elapsed="0.000240"/>
</kw>
<msg time="2026-04-11T00:47:11.360374" 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-11T00:47:11.359412" elapsed="0.001044"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:11.358932" elapsed="0.001605"/>
</kw>
<msg time="2026-04-11T00:47:11.360585" 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-11T00:47:11.350780" elapsed="0.009849"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:11.350326" elapsed="0.010376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:11.361162" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:11.360902" elapsed="0.000305"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:11.366203" 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-11T00:47:11.365819" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:11.366688" 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-11T00:47:11.366402" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:11.366786" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:47:11.366947" 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-11T00:47:11.365448" elapsed="0.001523"/>
</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-11T00:47:11.367121" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:11.367780" level="INFO">${ds_type} = operational</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-11T00:47:11.367449" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:11.368201" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:11.367960" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:11.368631" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:11.368371" elapsed="0.000290"/>
</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-11T00:47:11.369061" 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-11T00:47:11.369317" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:11.369169" 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-11T00:47:11.369558" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:11.369413" 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-11T00:47:11.369772" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:11.369635" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:11.369149" elapsed="0.000696"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:11.368893" elapsed="0.000977"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:11.368708" elapsed="0.001188"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:11.369935" elapsed="0.000026"/>
</return>
<msg time="2026-04-11T00:47:11.370132" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:11.370177" 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-11T00:47:11.364725" elapsed="0.005474"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:11.370745" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:11.370825" 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-11T00:47:11.370449" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:11.372562" 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-11T00:47:11.371137" elapsed="0.001496">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:11.370918" elapsed="0.001784">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:11.370899" elapsed="0.001836">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-11T00:47:11.372892" elapsed="0.000023"/>
</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-11T00:47:11.373067" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:11.373134" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:11.362215" elapsed="0.011058">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:11.361977" elapsed="0.011373">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:11.361835" elapsed="0.011586">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:11.361445" elapsed="0.012068">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:11.373746" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:11.341283" elapsed="0.032578">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:12.401118" elapsed="0.000242"/>
</kw>
<msg time="2026-04-11T00:47:12.401442" 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-11T00:47:12.400459" elapsed="0.001048"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:12.399980" elapsed="0.001609"/>
</kw>
<msg time="2026-04-11T00:47:12.401637" 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-11T00:47:12.391198" elapsed="0.010484"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:12.390138" elapsed="0.011618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:12.402218" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:12.401949" elapsed="0.000316"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:12.408528" 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-11T00:47:12.408122" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:12.409000" 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-11T00:47:12.408715" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:12.409079" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:12.409235" 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-11T00:47:12.407610" elapsed="0.001650"/>
</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-11T00:47:12.409511" elapsed="0.000164"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:12.410170" level="INFO">${ds_type} = operational</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-11T00:47:12.409835" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:12.410829" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:12.410355" elapsed="0.000501"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:12.411285" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:12.411006" elapsed="0.000308"/>
</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-11T00:47:12.411737" 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-11T00:47:12.411995" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:12.411846" elapsed="0.000209"/>
</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-11T00:47:12.412222" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:12.412081" 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-11T00:47:12.412459" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:12.412300" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:12.411827" elapsed="0.000708"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:12.411569" elapsed="0.000990"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:12.411363" elapsed="0.001223"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:12.412625" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:12.412824" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:12.412870" 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-11T00:47:12.406558" elapsed="0.006335"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:12.413335" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:12.413428" 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-11T00:47:12.413063" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:12.414019" 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-11T00:47:12.413738" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:12.413521" elapsed="0.000639">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:12.413504" 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-11T00:47:12.414342" 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-11T00:47:12.414532" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:12.414598" elapsed="0.000016"/>
</return>
<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>
<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-11T00:47:12.403302" elapsed="0.011401">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:12.403047" elapsed="0.011726">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:12.402905" elapsed="0.011922">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:12.402506" elapsed="0.012410">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:12.415146" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:12.374789" elapsed="0.040493">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:13.441713" elapsed="0.000241"/>
</kw>
<msg time="2026-04-11T00:47:13.442022" 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-11T00:47:13.440908" elapsed="0.001180"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:13.440411" elapsed="0.001756"/>
</kw>
<msg time="2026-04-11T00:47:13.442212" 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-11T00:47:13.432280" elapsed="0.009976"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:13.431729" elapsed="0.010601"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:13.442810" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:13.442550" elapsed="0.000306"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:13.448185" 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-11T00:47:13.447748" elapsed="0.000464"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:13.448683" 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-11T00:47:13.448375" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:13.448758" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:47:13.448920" 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-11T00:47:13.447357" 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-11T00:47:13.449103" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:13.449775" level="INFO">${ds_type} = operational</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-11T00:47:13.449439" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:13.450200" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:13.449959" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:13.450628" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:13.450374" elapsed="0.000279"/>
</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-11T00:47:13.451055" 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-11T00:47:13.451309" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:13.451162" 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-11T00:47:13.451544" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:13.451403" 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-11T00:47:13.451825" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:13.451660" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:13.451143" elapsed="0.000762"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:13.450889" elapsed="0.001039"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:13.450704" elapsed="0.001251"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:13.451995" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:47:13.452205" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:13.452252" 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-11T00:47:13.446640" elapsed="0.005637"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:13.452761" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:13.452838" 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-11T00:47:13.452464" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:13.453549" 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-11T00:47:13.453224" elapsed="0.000410">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:13.453003" elapsed="0.000705">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:13.452984" elapsed="0.000757">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-11T00:47:13.453894" 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-11T00:47:13.454068" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:13.454135" elapsed="0.000016"/>
</return>
<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>
<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-11T00:47:13.443899" elapsed="0.010347">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:13.443649" elapsed="0.010668">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:13.443506" elapsed="0.010867">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:13.443092" elapsed="0.011390">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:13.454728" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:13.416167" elapsed="0.038680">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:14.479365" elapsed="0.000261"/>
</kw>
<msg time="2026-04-11T00:47:14.479694" 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-11T00:47:14.478720" elapsed="0.001039"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:14.478247" elapsed="0.001592"/>
</kw>
<msg time="2026-04-11T00:47:14.479886" 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-11T00:47:14.470138" elapsed="0.009793"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:14.469725" elapsed="0.010280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:14.480501" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:14.480200" elapsed="0.000347"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:14.485546" 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-11T00:47:14.485146" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:14.486023" 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-11T00:47:14.485736" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:14.486100" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:47:14.486258" 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-11T00:47:14.484765" elapsed="0.001518"/>
</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-11T00:47:14.486450" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:14.487100" level="INFO">${ds_type} = operational</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-11T00:47:14.486768" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:14.487539" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:14.487282" elapsed="0.000349"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:14.488027" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:14.487784" elapsed="0.000269"/>
</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-11T00:47:14.488493" 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-11T00:47:14.488749" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:14.488602" 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-11T00:47:14.488972" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:14.488830" 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-11T00:47:14.489197" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:14.489050" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:14.488584" elapsed="0.000688"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:14.488286" elapsed="0.001010"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:14.488101" elapsed="0.001220"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:14.489360" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:47:14.489579" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:14.489625" 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-11T00:47:14.484023" elapsed="0.005625"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:14.490097" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:14.490174" 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-11T00:47:14.489818" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:14.490959" 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-11T00:47:14.490496" elapsed="0.000535">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:14.490267" elapsed="0.000833">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:14.490250" elapsed="0.000882">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-11T00:47:14.491283" 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-11T00:47:14.491472" elapsed="0.000027"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:14.491545" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:14.481547" elapsed="0.010102">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:14.481302" elapsed="0.010415">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:14.481164" elapsed="0.010607">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:14.480772" elapsed="0.011087">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:14.492087" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:14.455898" elapsed="0.036303">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:15.515731" elapsed="0.000234"/>
</kw>
<msg time="2026-04-11T00:47:15.516029" 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-11T00:47:15.515076" elapsed="0.001015"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:15.514621" elapsed="0.001548"/>
</kw>
<msg time="2026-04-11T00:47:15.516296" 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-11T00:47:15.506589" elapsed="0.009754"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:15.506168" elapsed="0.010266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:15.517043" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:15.516630" elapsed="0.000465"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:15.522297" 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-11T00:47:15.521913" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:15.522783" 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-11T00:47:15.522497" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:15.522858" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:15.523013" 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-11T00:47:15.521546" elapsed="0.001491"/>
</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-11T00:47:15.523187" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:15.523861" level="INFO">${ds_type} = operational</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-11T00:47:15.523529" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:15.524282" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:15.524042" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:15.524703" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:15.524466" 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-11T00:47:15.525138" 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-11T00:47:15.525406" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:15.525244" 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-11T00:47:15.525627" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:15.525488" elapsed="0.000191"/>
</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-11T00:47:15.525839" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:15.525702" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:15.525226" elapsed="0.000686"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:15.524971" elapsed="0.000964"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:15.524774" elapsed="0.001186"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:15.525998" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:15.526195" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:15.526240" 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-11T00:47:15.520802" elapsed="0.005474"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:15.526734" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:15.526811" 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-11T00:47:15.526462" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:15.527422" 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-11T00:47:15.527128" elapsed="0.000368">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:15.526901" elapsed="0.000662">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:15.526884" elapsed="0.000755">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-11T00:47:15.527796" 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-11T00:47:15.527967" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:15.528032" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:15.518122" elapsed="0.010016">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:15.517891" elapsed="0.010317">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:15.517751" elapsed="0.010511">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:15.517329" elapsed="0.011023">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:15.528596" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:15.493167" elapsed="0.035545">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:16.552787" elapsed="0.000250"/>
</kw>
<msg time="2026-04-11T00:47:16.553109" 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-11T00:47:16.552112" elapsed="0.001071"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:16.551652" elapsed="0.001610"/>
</kw>
<msg time="2026-04-11T00:47:16.553308" 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-11T00:47:16.543565" elapsed="0.009787"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:16.543132" elapsed="0.010342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:16.553937" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:16.553677" elapsed="0.000305"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:16.559048" 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-11T00:47:16.558656" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:16.559552" 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-11T00:47:16.559250" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:16.559627" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:47:16.559787" 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-11T00:47:16.558261" elapsed="0.001549"/>
</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-11T00:47:16.559958" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:16.560612" level="INFO">${ds_type} = operational</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-11T00:47:16.560267" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:16.561024" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:16.560791" elapsed="0.000258"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:16.561453" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:16.561193" 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-11T00:47:16.561894" 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-11T00:47:16.562234" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:16.562080" elapsed="0.000210"/>
</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-11T00:47:16.562480" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:16.562316" elapsed="0.000231"/>
</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-11T00:47:16.562711" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:16.562570" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:16.562059" elapsed="0.000725"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:16.561728" elapsed="0.001081"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:16.561526" elapsed="0.001310"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:16.562875" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:16.563076" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:16.563121" 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-11T00:47:16.557536" elapsed="0.005607"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:16.563616" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:16.563695" 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-11T00:47:16.563311" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:16.564485" 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-11T00:47:16.564170" elapsed="0.000395">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:16.563787" elapsed="0.000848">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:16.563769" elapsed="0.000898">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-11T00:47:16.564818" 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-11T00:47:16.564990" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:16.565056" elapsed="0.000014"/>
</return>
<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>
<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-11T00:47:16.554992" elapsed="0.010170">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:16.554764" elapsed="0.010466">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:16.554618" elapsed="0.010665">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:16.554206" elapsed="0.011165">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:16.565654" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:16.529710" elapsed="0.036060">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:17.588894" elapsed="0.000244"/>
</kw>
<msg time="2026-04-11T00:47:17.589206" 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-11T00:47:17.588240" elapsed="0.001032"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:17.587785" elapsed="0.001565"/>
</kw>
<msg time="2026-04-11T00:47:17.589410" 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-11T00:47:17.579790" elapsed="0.009665"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:17.579369" elapsed="0.010165"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:17.590088" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:17.589802" elapsed="0.000332"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:17.595256" 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-11T00:47:17.594863" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:17.595746" 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-11T00:47:17.595457" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:17.595819" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:47:17.595975" 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-11T00:47:17.594497" elapsed="0.001503"/>
</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-11T00:47:17.596150" elapsed="0.000150"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:17.596798" level="INFO">${ds_type} = operational</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-11T00:47:17.596470" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:17.597218" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:17.596978" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:17.597641" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:17.597399" elapsed="0.000267"/>
</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-11T00:47:17.598091" 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-11T00:47:17.598348" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:17.598202" elapsed="0.000216"/>
</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-11T00:47:17.598583" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:17.598443" elapsed="0.000192"/>
</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-11T00:47:17.598795" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:17.598658" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:17.598182" elapsed="0.000686"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:17.597890" elapsed="0.001001"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:17.597712" elapsed="0.001204"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:17.598954" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:17.599152" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:17.599198" 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-11T00:47:17.593752" elapsed="0.005469"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:17.599668" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:17.599744" 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-11T00:47:17.599400" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:17.600332" 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-11T00:47:17.600050" elapsed="0.000370">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:17.599834" elapsed="0.000654">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:17.599817" 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-11T00:47:17.600668" 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-11T00:47:17.600838" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:17.600903" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:17.591132" elapsed="0.009909">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:17.590907" elapsed="0.010206">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:17.590766" elapsed="0.010402">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:17.590357" elapsed="0.010903">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:17.601509" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:17.566727" elapsed="0.034899">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:18.626361" elapsed="0.000310"/>
</kw>
<msg time="2026-04-11T00:47:18.626744" 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-11T00:47:18.625552" elapsed="0.001261"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:18.624880" elapsed="0.002014"/>
</kw>
<msg time="2026-04-11T00:47:18.626943" 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-11T00:47:18.616775" elapsed="0.010212"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:18.616343" elapsed="0.010720"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:18.627590" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:18.627286" elapsed="0.000352"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:18.632807" 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-11T00:47:18.632374" elapsed="0.000460"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:18.633279" 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-11T00:47:18.632992" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:18.633353" elapsed="0.000046"/>
</return>
<msg time="2026-04-11T00:47:18.633527" 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-11T00:47:18.631988" elapsed="0.001563"/>
</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-11T00:47:18.633731" elapsed="0.000160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:18.634712" level="INFO">${ds_type} = operational</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-11T00:47:18.634329" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:18.635128" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:18.634894" elapsed="0.000259"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:18.635568" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:18.635303" elapsed="0.000290"/>
</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-11T00:47:18.635987" 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-11T00:47:18.636248" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:18.636100" 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-11T00:47:18.636479" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:18.636327" elapsed="0.000292"/>
</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-11T00:47:18.636789" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:18.636644" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:18.636076" elapsed="0.000788"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:18.635823" elapsed="0.001064"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:18.635641" elapsed="0.001272"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:18.636991" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:18.637190" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:18.637236" 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-11T00:47:18.631268" elapsed="0.005996"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:18.637724" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:18.637799" 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-11T00:47:18.637449" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:18.638628" 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-11T00:47:18.638292" elapsed="0.000414">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:18.638068" elapsed="0.000705">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:18.637873" elapsed="0.000932">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-11T00:47:18.638956" 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-11T00:47:18.639128" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:18.639193" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:18.628721" elapsed="0.010576">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:18.628482" elapsed="0.010884">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:18.628305" elapsed="0.011132">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:18.627877" elapsed="0.011649">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:18.639773" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:18.602562" elapsed="0.037328">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:19.664938" elapsed="0.000240"/>
</kw>
<msg time="2026-04-11T00:47:19.665244" 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-11T00:47:19.664285" elapsed="0.001024"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:19.663832" elapsed="0.001576"/>
</kw>
<msg time="2026-04-11T00:47:19.665456" 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-11T00:47:19.655820" elapsed="0.009679"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:19.655414" elapsed="0.010156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:19.666016" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:19.665762" elapsed="0.000298"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:19.671361" 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-11T00:47:19.670911" elapsed="0.000502"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:19.671861" 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-11T00:47:19.671578" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:19.671934" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:47:19.672089" 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-11T00:47:19.670536" elapsed="0.001577"/>
</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-11T00:47:19.672263" elapsed="0.000168"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:19.672915" level="INFO">${ds_type} = operational</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-11T00:47:19.672588" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:19.673329" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:19.673096" elapsed="0.000258"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:19.673749" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:19.673513" elapsed="0.000261"/>
</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-11T00:47:19.674161" 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-11T00:47:19.674432" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:19.674267" elapsed="0.000222"/>
</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-11T00:47:19.674654" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:19.674514" 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-11T00:47:19.674872" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:19.674730" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:19.674248" elapsed="0.000698"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:19.673999" elapsed="0.000971"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:19.673820" elapsed="0.001174"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:19.675060" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:47:19.675262" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:19.675307" 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-11T00:47:19.669815" elapsed="0.005514"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:19.675778" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:19.675853" 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-11T00:47:19.675513" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:19.676460" 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-11T00:47:19.676154" elapsed="0.000379">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:19.675943" elapsed="0.000657">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:19.675926" elapsed="0.000705">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-11T00:47:19.676780" 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-11T00:47:19.676949" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:19.677013" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:19.667098" elapsed="0.010018">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:19.666836" elapsed="0.010349">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:19.666695" elapsed="0.010544">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:19.666281" elapsed="0.011081">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:19.677608" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:19.640830" elapsed="0.036892">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:20.703513" elapsed="0.000270"/>
</kw>
<msg time="2026-04-11T00:47:20.703852" 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-11T00:47:20.702851" elapsed="0.001068"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:20.702394" elapsed="0.001603"/>
</kw>
<msg time="2026-04-11T00:47:20.704042" 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-11T00:47:20.694315" elapsed="0.009770"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:20.693900" elapsed="0.010256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:20.704614" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:20.704342" elapsed="0.000317"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:20.709583" 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-11T00:47:20.709185" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:20.710050" 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-11T00:47:20.709767" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:20.710123" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:47:20.710283" 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-11T00:47:20.708821" elapsed="0.001486"/>
</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-11T00:47:20.710469" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:20.711111" level="INFO">${ds_type} = operational</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-11T00:47:20.710779" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:20.711543" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:20.711290" elapsed="0.000302"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:20.711975" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:20.711740" elapsed="0.000259"/>
</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-11T00:47:20.712402" 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-11T00:47:20.712654" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:20.712509" 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-11T00:47:20.712871" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:20.712734" elapsed="0.000190"/>
</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-11T00:47:20.713086" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:20.712947" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:20.712491" elapsed="0.000668"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:20.712224" elapsed="0.000958"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:20.712045" elapsed="0.001225"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:20.713314" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:20.713527" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:20.713571" 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-11T00:47:20.708109" elapsed="0.005484"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:20.714025" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:20.714100" 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-11T00:47:20.713760" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:20.714873" 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-11T00:47:20.714417" elapsed="0.000527">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:20.714190" elapsed="0.000821">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:20.714173" elapsed="0.000870">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-11T00:47:20.715194" 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-11T00:47:20.715365" elapsed="0.000036"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:20.715448" elapsed="0.000016"/>
</return>
<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>
<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-11T00:47:20.705665" elapsed="0.009890">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:20.705435" elapsed="0.010199">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:20.705275" elapsed="0.010413">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:20.704879" elapsed="0.010896">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:20.716005" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:20.678676" elapsed="0.037441">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:21.739249" elapsed="0.000252"/>
</kw>
<msg time="2026-04-11T00:47:21.739566" 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-11T00:47:21.738602" elapsed="0.001029"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:21.738132" elapsed="0.001580"/>
</kw>
<msg time="2026-04-11T00:47:21.739757" 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-11T00:47:21.730124" elapsed="0.009678"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:21.729710" elapsed="0.010167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:21.740342" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:21.740069" elapsed="0.000332"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:21.745422" 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-11T00:47:21.745020" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:21.745899" 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-11T00:47:21.745610" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:21.746044" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:47:21.746206" 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-11T00:47:21.744648" elapsed="0.001583"/>
</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-11T00:47:21.746398" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:21.747045" level="INFO">${ds_type} = operational</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-11T00:47:21.746714" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:21.747673" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:21.747227" elapsed="0.000473"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:21.748097" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:21.747853" elapsed="0.000282"/>
</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-11T00:47:21.748549" 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-11T00:47:21.748804" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:21.748657" 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-11T00:47:21.749027" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:21.748885" 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-11T00:47:21.749247" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:21.749105" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:21.748638" elapsed="0.000684"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:21.748367" elapsed="0.000978"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:21.748183" elapsed="0.001188"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:21.749426" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:47:21.749627" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:21.749673" 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-11T00:47:21.743862" elapsed="0.005834"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:21.750133" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:21.750209" 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-11T00:47:21.749865" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:21.750807" 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-11T00:47:21.750530" elapsed="0.000349">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:21.750301" elapsed="0.000643">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:21.750283" elapsed="0.000693">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-11T00:47:21.751126" 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-11T00:47:21.751300" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:21.751367" elapsed="0.000029"/>
</return>
<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>
<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-11T00:47:21.741399" elapsed="0.010087">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:21.741154" elapsed="0.010401">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:21.741015" elapsed="0.010594">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:21.740625" elapsed="0.011073">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:21.751927" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:21.717071" elapsed="0.035058">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:22.780151" elapsed="0.000267"/>
</kw>
<msg time="2026-04-11T00:47:22.780491" 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-11T00:47:22.779499" elapsed="0.001063"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:22.779026" elapsed="0.001625"/>
</kw>
<msg time="2026-04-11T00:47:22.780698" 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-11T00:47:22.770949" elapsed="0.009793"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:22.770530" elapsed="0.010285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:22.781267" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:22.781011" elapsed="0.000301"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:22.786570" 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-11T00:47:22.786173" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:22.787041" 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-11T00:47:22.786756" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:22.787114" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:47:22.787273" 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-11T00:47:22.785808" elapsed="0.001489"/>
</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-11T00:47:22.787463" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:22.788114" level="INFO">${ds_type} = operational</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-11T00:47:22.787781" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:22.788551" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:22.788294" elapsed="0.000283"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:22.788985" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:22.788734" 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-11T00:47:22.789420" 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-11T00:47:22.789677" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:22.789527" 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-11T00:47:22.789897" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:22.789757" 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-11T00:47:22.790112" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:22.789973" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:22.789508" elapsed="0.000677"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:22.789241" elapsed="0.000968"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:22.789058" elapsed="0.001176"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:22.790274" elapsed="0.000026"/>
</return>
<msg time="2026-04-11T00:47:22.790488" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:22.790533" 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-11T00:47:22.785076" elapsed="0.005480"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:22.791059" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:22.791135" 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-11T00:47:22.790788" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:22.791737" 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-11T00:47:22.791455" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:22.791226" elapsed="0.000650">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:22.791208" elapsed="0.000700">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-11T00:47:22.792059" 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-11T00:47:22.792230" elapsed="0.000027"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:22.792303" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:22.782340" elapsed="0.010088">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:22.782095" elapsed="0.010405">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:22.781948" elapsed="0.010608">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:22.781553" elapsed="0.011121">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:22.792907" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:22.753100" elapsed="0.039922">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:23.819329" elapsed="0.000265"/>
</kw>
<msg time="2026-04-11T00:47:23.819664" 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-11T00:47:23.818681" elapsed="0.001052"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:23.818204" elapsed="0.001608"/>
</kw>
<msg time="2026-04-11T00:47:23.819858" 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-11T00:47:23.810118" elapsed="0.009783"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:23.809683" elapsed="0.010290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:23.820435" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:23.820165" elapsed="0.000315"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:23.825529" 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-11T00:47:23.825098" elapsed="0.000459"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:23.826001" 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-11T00:47:23.825715" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:23.826076" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:23.826234" 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-11T00:47:23.824732" elapsed="0.001527"/>
</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-11T00:47:23.826428" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:23.827094" level="INFO">${ds_type} = operational</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-11T00:47:23.826756" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:23.827642" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:23.827348" elapsed="0.000321"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:23.828058" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:23.827819" elapsed="0.000265"/>
</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-11T00:47:23.828501" 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-11T00:47:23.828756" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:23.828610" 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-11T00:47:23.828979" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:23.828838" 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-11T00:47:23.829216" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:23.829057" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:23.828591" elapsed="0.000705"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:23.828312" elapsed="0.001008"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:23.828130" elapsed="0.001214"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:23.829403" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:47:23.829606" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:23.829652" 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-11T00:47:23.824009" elapsed="0.005667"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:23.830121" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:23.830199" 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-11T00:47:23.829846" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:23.831008" 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-11T00:47:23.830527" elapsed="0.000553">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:23.830291" elapsed="0.000856">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:23.830273" elapsed="0.000906">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-11T00:47:23.831331" 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-11T00:47:23.831523" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:23.831590" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:23.821531" elapsed="0.010165">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:23.821283" elapsed="0.010483">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:23.821106" elapsed="0.010715">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:23.820703" elapsed="0.011208">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:23.832141" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:23.793941" elapsed="0.038317">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:24.859581" elapsed="0.000242"/>
</kw>
<msg time="2026-04-11T00:47:24.859891" 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-11T00:47:24.858920" elapsed="0.001037"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:24.858455" elapsed="0.001671"/>
</kw>
<msg time="2026-04-11T00:47:24.860174" 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-11T00:47:24.850294" elapsed="0.009925"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:24.849690" elapsed="0.010604"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:24.860761" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:24.860500" elapsed="0.000308"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:24.865839" 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-11T00:47:24.865430" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:24.866317" 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-11T00:47:24.866030" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:24.866407" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:47:24.866567" 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-11T00:47:24.865044" elapsed="0.001548"/>
</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-11T00:47:24.866744" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:24.867609" level="INFO">${ds_type} = operational</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-11T00:47:24.867056" elapsed="0.000580"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:24.868035" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:24.867794" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:24.868463" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:24.868209" elapsed="0.000280"/>
</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-11T00:47:24.868878" 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-11T00:47:24.869137" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:24.868987" 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-11T00:47:24.869357" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:24.869217" elapsed="0.000210"/>
</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-11T00:47:24.869593" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:24.869451" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:24.868969" elapsed="0.000698"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:24.868715" elapsed="0.000976"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:24.868535" elapsed="0.001180"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:24.869768" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:24.869973" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:24.870018" 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-11T00:47:24.864322" elapsed="0.005719"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:24.870511" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:24.870588" 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-11T00:47:24.870215" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:24.871176" 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-11T00:47:24.870893" elapsed="0.000354">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:24.870679" elapsed="0.000683">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:24.870662" elapsed="0.000750">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-11T00:47:24.871567" 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-11T00:47:24.871741" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:24.871806" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:24.861842" elapsed="0.010070">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:24.861590" elapsed="0.010391">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:24.861443" elapsed="0.010592">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:24.861031" elapsed="0.011093">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:24.872351" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:24.833182" elapsed="0.039300">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:25.900443" elapsed="0.000240"/>
</kw>
<msg time="2026-04-11T00:47:25.900748" 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-11T00:47:25.899785" elapsed="0.001026"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:25.899315" elapsed="0.001575"/>
</kw>
<msg time="2026-04-11T00:47:25.900937" 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-11T00:47:25.891236" elapsed="0.009745"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:25.890673" elapsed="0.010382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:25.901525" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:25.901251" elapsed="0.000319"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:25.906971" 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-11T00:47:25.906577" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:25.907466" 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-11T00:47:25.907160" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:25.907542" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:25.907701" 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-11T00:47:25.906166" elapsed="0.001560"/>
</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-11T00:47:25.907887" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:25.908558" level="INFO">${ds_type} = operational</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-11T00:47:25.908205" elapsed="0.000379"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:25.908977" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:25.908740" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:25.909395" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:25.909148" elapsed="0.000274"/>
</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-11T00:47:25.909883" 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-11T00:47:25.910143" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:25.909992" elapsed="0.000206"/>
</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-11T00:47:25.910416" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:25.910223" elapsed="0.000252"/>
</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-11T00:47:25.910641" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:25.910499" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:25.909973" elapsed="0.000743"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:25.909648" elapsed="0.001092"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:25.909468" elapsed="0.001298"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:25.910805" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:25.911011" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:25.911056" 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-11T00:47:25.905426" elapsed="0.005653"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:25.911536" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:25.911611" 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-11T00:47:25.911249" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:25.912210" 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-11T00:47:25.911923" elapsed="0.000362">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:25.911703" elapsed="0.000650">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:25.911685" elapsed="0.000713">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-11T00:47:25.912552" 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-11T00:47:25.912723" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:25.912787" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:25.902588" elapsed="0.010303">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:25.902343" elapsed="0.010616">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:25.902183" elapsed="0.010831">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:25.901794" elapsed="0.011307">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:25.913329" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:25.873327" elapsed="0.040135">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:26.937914" elapsed="0.000243"/>
</kw>
<msg time="2026-04-11T00:47:26.938227" 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-11T00:47:26.937261" elapsed="0.001034"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:26.936800" elapsed="0.001573"/>
</kw>
<msg time="2026-04-11T00:47:26.938436" 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-11T00:47:26.928711" elapsed="0.009771"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:26.928277" elapsed="0.010346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:26.939122" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:26.938842" elapsed="0.000326"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:26.944149" 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-11T00:47:26.943749" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:26.944636" 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-11T00:47:26.944335" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:26.944710" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:26.944868" 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-11T00:47:26.943365" elapsed="0.001527"/>
</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-11T00:47:26.945042" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:26.945697" level="INFO">${ds_type} = operational</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-11T00:47:26.945352" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:26.946111" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:26.945878" elapsed="0.000259"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:26.946529" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:26.946281" elapsed="0.000274"/>
</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-11T00:47:26.946985" elapsed="0.000026"/>
</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-11T00:47:26.947241" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:26.947094" 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-11T00:47:26.947473" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:26.947319" elapsed="0.000209"/>
</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-11T00:47:26.947691" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:26.947551" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:26.947075" elapsed="0.000689"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:26.946780" elapsed="0.001008"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:26.946601" elapsed="0.001212"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:26.947853" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:26.948050" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:26.948096" 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-11T00:47:26.942647" elapsed="0.005473"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:26.948576" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:26.948652" 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-11T00:47:26.948292" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:26.949426" 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-11T00:47:26.949126" elapsed="0.000375">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:26.948743" elapsed="0.000825">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:26.948726" elapsed="0.000873">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-11T00:47:26.949749" 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-11T00:47:26.949925" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:26.950026" elapsed="0.000017"/>
</return>
<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>
<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-11T00:47:26.940180" elapsed="0.009954">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:26.939946" elapsed="0.010258">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:26.939805" elapsed="0.010453">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:26.939408" elapsed="0.010938">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:26.950590" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:26.914303" elapsed="0.036402">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:27.975831" elapsed="0.000241"/>
</kw>
<msg time="2026-04-11T00:47:27.976135" 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-11T00:47:27.975144" elapsed="0.001053"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:27.974687" elapsed="0.001589"/>
</kw>
<msg time="2026-04-11T00:47:27.976322" 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-11T00:47:27.965916" elapsed="0.010450"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:27.965339" elapsed="0.011121"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:27.976911" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:27.976654" elapsed="0.000303"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:27.982122" 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-11T00:47:27.981735" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:27.982611" 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-11T00:47:27.982308" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:27.982684" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:47:27.982840" 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-11T00:47:27.981349" elapsed="0.001516"/>
</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-11T00:47:27.983020" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:27.983700" level="INFO">${ds_type} = operational</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-11T00:47:27.983328" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:27.984124" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:27.983881" elapsed="0.000269"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:27.984548" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:27.984294" elapsed="0.000280"/>
</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-11T00:47:27.984963" 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-11T00:47:27.985215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:27.985069" elapsed="0.000261"/>
</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-11T00:47:27.985520" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:27.985358" elapsed="0.000219"/>
</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-11T00:47:27.985742" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:27.985601" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:27.985051" elapsed="0.000767"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:27.984798" elapsed="0.001045"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:27.984619" elapsed="0.001250"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:27.985908" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:27.986109" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:27.986156" 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-11T00:47:27.980641" elapsed="0.005538"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:27.986631" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:27.986707" 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-11T00:47:27.986348" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:27.987297" 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-11T00:47:27.987022" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:27.986800" elapsed="0.000664">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:27.986782" elapsed="0.000714">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-11T00:47:27.987647" 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-11T00:47:27.987819" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:27.987884" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:27.977949" elapsed="0.010039">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:27.977724" elapsed="0.010333">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:27.977587" elapsed="0.010525">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:27.977177" elapsed="0.011025">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:27.988447" elapsed="0.000027"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:27.951625" elapsed="0.036943">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:29.014359" elapsed="0.000296"/>
</kw>
<msg time="2026-04-11T00:47:29.014727" 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-11T00:47:29.013682" elapsed="0.001114"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:29.013166" elapsed="0.001710"/>
</kw>
<msg time="2026-04-11T00:47:29.014929" 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-11T00:47:29.003162" elapsed="0.011812"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:29.002557" elapsed="0.012491"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:29.015539" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:29.015247" elapsed="0.000338"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:29.021032" 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-11T00:47:29.020587" elapsed="0.000473"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:29.021536" 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-11T00:47:29.021222" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:29.021613" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:47:29.021776" 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-11T00:47:29.020168" elapsed="0.001632"/>
</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-11T00:47:29.021951" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:29.022638" level="INFO">${ds_type} = operational</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-11T00:47:29.022268" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:29.023064" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:29.022824" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:29.023508" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:29.023236" elapsed="0.000305"/>
</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-11T00:47:29.023949" 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-11T00:47:29.024209" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:29.024060" elapsed="0.000206"/>
</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-11T00:47:29.024445" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:29.024291" elapsed="0.000216"/>
</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-11T00:47:29.024678" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:29.024534" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:29.024040" elapsed="0.000712"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:29.023775" elapsed="0.001002"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:29.023592" elapsed="0.001236"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:29.024873" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:29.025074" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:29.025120" 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-11T00:47:29.019429" elapsed="0.005714"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:29.025619" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:29.025699" 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-11T00:47:29.025313" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:29.028077" 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-11T00:47:29.027780" elapsed="0.000373">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:29.027543" elapsed="0.000678">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:29.025774" elapsed="0.002480">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-11T00:47:29.028425" elapsed="0.000024"/>
</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-11T00:47:29.028619" elapsed="0.000023"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:29.028689" elapsed="0.000016"/>
</return>
<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>
<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-11T00:47:29.016887" elapsed="0.011909">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:29.016567" elapsed="0.012366">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:29.016373" elapsed="0.012616">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:29.015894" elapsed="0.013187">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:29.029316" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:28.989339" elapsed="0.040113">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:30.053967" elapsed="0.000255"/>
</kw>
<msg time="2026-04-11T00:47:30.054296" 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-11T00:47:30.053302" elapsed="0.001103"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:30.052840" elapsed="0.001653"/>
</kw>
<msg time="2026-04-11T00:47:30.054542" 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-11T00:47:30.044737" elapsed="0.009852"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:30.044219" elapsed="0.010442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:30.055118" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:30.054861" elapsed="0.000301"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:30.060376" 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-11T00:47:30.059992" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:30.060887" 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-11T00:47:30.060584" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:30.060962" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:47:30.061124" 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-11T00:47:30.059621" elapsed="0.001527"/>
</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-11T00:47:30.061299" elapsed="0.000200"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:30.061991" level="INFO">${ds_type} = operational</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-11T00:47:30.061660" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:30.062455" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:30.062171" elapsed="0.000310"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:30.062870" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:30.062633" 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-11T00:47:30.063290" 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-11T00:47:30.063573" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:30.063417" elapsed="0.000211"/>
</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-11T00:47:30.063791" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:30.063654" elapsed="0.000190"/>
</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-11T00:47:30.064006" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:30.063867" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:30.063396" elapsed="0.000756"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:30.063124" elapsed="0.001053"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:30.062943" elapsed="0.001260"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:30.064245" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:30.064462" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:30.064507" 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-11T00:47:30.058899" elapsed="0.005631"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:30.064970" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:30.065046" 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-11T00:47:30.064699" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:30.065655" 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-11T00:47:30.065350" elapsed="0.000384">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:30.065137" elapsed="0.000667">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:30.065119" elapsed="0.000716">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-11T00:47:30.065985" 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-11T00:47:30.066156" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:30.066220" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:30.056202" elapsed="0.010123">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:30.055962" elapsed="0.010467">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:30.055812" elapsed="0.010675">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:30.055408" elapsed="0.011168">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:30.066804" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:30.030560" elapsed="0.036358">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:31.091908" elapsed="0.000238"/>
</kw>
<msg time="2026-04-11T00:47:31.092210" 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-11T00:47:31.091218" elapsed="0.001056"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:31.090742" elapsed="0.001611"/>
</kw>
<msg time="2026-04-11T00:47:31.092417" 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-11T00:47:31.082547" elapsed="0.009917"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:31.082062" elapsed="0.010522"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:31.093056" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:31.092784" elapsed="0.000318"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:31.098214" 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-11T00:47:31.097825" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:31.098788" 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-11T00:47:31.098494" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:31.098864" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:31.099022" 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-11T00:47:31.097456" elapsed="0.001591"/>
</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-11T00:47:31.099199" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:31.099878" level="INFO">${ds_type} = operational</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-11T00:47:31.099533" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:31.100301" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:31.100062" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:31.100728" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:31.100490" elapsed="0.000264"/>
</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-11T00:47:31.101149" 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-11T00:47:31.101430" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:31.101257" elapsed="0.000236"/>
</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-11T00:47:31.101663" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:31.101518" 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-11T00:47:31.101881" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:31.101740" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:31.101239" elapsed="0.000716"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:31.100983" elapsed="0.000995"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:31.100801" elapsed="0.001202"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:31.102042" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:31.102241" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:31.102287" 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-11T00:47:31.096729" elapsed="0.005580"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:31.102764" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:31.102840" 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-11T00:47:31.102494" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:31.103668" 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-11T00:47:31.103146" elapsed="0.000594">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:31.102932" elapsed="0.000874">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:31.102914" elapsed="0.000924">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-11T00:47:31.104020" elapsed="0.000044"/>
</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-11T00:47:31.104246" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:31.104313" elapsed="0.000016"/>
</return>
<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>
<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-11T00:47:31.094173" elapsed="0.010264">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:31.093939" elapsed="0.010568">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:31.093743" elapsed="0.010817">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:31.093330" elapsed="0.011317">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:31.104880" elapsed="0.000067"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:31.067844" elapsed="0.037199">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:32.131229" elapsed="0.000266"/>
</kw>
<msg time="2026-04-11T00:47:32.131567" 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-11T00:47:32.130582" elapsed="0.001054"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:32.130106" elapsed="0.001610"/>
</kw>
<msg time="2026-04-11T00:47:32.131761" 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-11T00:47:32.121556" elapsed="0.010249"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:32.121089" elapsed="0.010790"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:32.132334" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:32.132077" elapsed="0.000302"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:32.137466" 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-11T00:47:32.137028" elapsed="0.000466"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:32.137972" 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-11T00:47:32.137657" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:32.138073" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:47:32.138283" 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-11T00:47:32.136650" elapsed="0.001667"/>
</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-11T00:47:32.138521" elapsed="0.000161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:32.139174" level="INFO">${ds_type} = operational</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-11T00:47:32.138841" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:32.139814" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:32.139356" elapsed="0.000484"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:32.140228" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:32.139990" elapsed="0.000264"/>
</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-11T00:47:32.140668" 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-11T00:47:32.140926" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:32.140776" 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-11T00:47:32.141144" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:32.141005" elapsed="0.000192"/>
</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-11T00:47:32.141403" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:32.141221" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:32.140757" elapsed="0.000726"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:32.140501" elapsed="0.001005"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:32.140302" elapsed="0.001231"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:32.141572" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:32.141772" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:32.141817" 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-11T00:47:32.135927" elapsed="0.005913"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:32.142358" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:32.142452" 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-11T00:47:32.142085" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:32.143046" 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-11T00:47:32.142763" elapsed="0.000356">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:32.142546" elapsed="0.000640">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:32.142528" elapsed="0.000690">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-11T00:47:32.143371" elapsed="0.000038"/>
</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-11T00:47:32.143564" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:32.143637" elapsed="0.000016"/>
</return>
<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>
<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-11T00:47:32.133450" elapsed="0.010294">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:32.133157" elapsed="0.010656">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:32.133011" elapsed="0.010857">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:32.132620" elapsed="0.011339">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:32.144190" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:32.105986" elapsed="0.038318">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:33.172468" elapsed="0.000236"/>
</kw>
<msg time="2026-04-11T00:47:33.172767" 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-11T00:47:33.171813" elapsed="0.001018"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:33.171342" elapsed="0.001566"/>
</kw>
<msg time="2026-04-11T00:47:33.172953" 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-11T00:47:33.163231" elapsed="0.009766"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:33.162660" elapsed="0.010410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:33.173539" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:33.173265" elapsed="0.000320"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:33.178861" 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-11T00:47:33.178456" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:33.179330" 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-11T00:47:33.179048" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:33.179419" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:47:33.179580" 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-11T00:47:33.178074" elapsed="0.001531"/>
</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-11T00:47:33.179825" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:33.180492" level="INFO">${ds_type} = operational</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-11T00:47:33.180142" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:33.180917" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:33.180677" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:33.181337" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:33.181091" elapsed="0.000272"/>
</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-11T00:47:33.181777" 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-11T00:47:33.182036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:33.181885" elapsed="0.000208"/>
</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-11T00:47:33.182261" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:33.182118" elapsed="0.000197"/>
</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-11T00:47:33.182502" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:33.182339" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:33.181866" elapsed="0.000713"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:33.181612" elapsed="0.000991"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:33.181426" elapsed="0.001203"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:33.182683" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:33.182883" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:33.182930" 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-11T00:47:33.177357" elapsed="0.005597"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:33.183408" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:33.183487" 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-11T00:47:33.183121" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:33.184072" 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-11T00:47:33.183793" elapsed="0.000349">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:33.183579" elapsed="0.000628">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:33.183561" elapsed="0.000678">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-11T00:47:33.184406" elapsed="0.000023"/>
</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-11T00:47:33.184581" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:33.184647" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:33.174600" elapsed="0.010150">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:33.174347" elapsed="0.010473">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:33.174207" elapsed="0.010667">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:33.173813" elapsed="0.011151">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:33.185204" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:33.145190" elapsed="0.040131">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:34.210620" elapsed="0.000239"/>
</kw>
<msg time="2026-04-11T00:47:34.210926" 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-11T00:47:34.209873" elapsed="0.001117"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:34.209408" elapsed="0.001662"/>
</kw>
<msg time="2026-04-11T00:47:34.211115" 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-11T00:47:34.201275" elapsed="0.009884"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:34.200866" elapsed="0.010367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:34.211697" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:34.211439" elapsed="0.000303"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:34.216776" 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-11T00:47:34.216374" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:34.217250" 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-11T00:47:34.216962" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:34.217325" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:47:34.217526" 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-11T00:47:34.215976" 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-11T00:47:34.217705" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:34.218362" level="INFO">${ds_type} = operational</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-11T00:47:34.218023" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:34.218802" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:34.218564" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:34.219212" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:34.218973" elapsed="0.000265"/>
</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-11T00:47:34.219640" 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-11T00:47:34.219897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:34.219746" elapsed="0.000208"/>
</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-11T00:47:34.220178" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:34.220017" elapsed="0.000217"/>
</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-11T00:47:34.220411" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:34.220257" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:34.219727" elapsed="0.000759"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:34.219476" elapsed="0.001034"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:34.219284" elapsed="0.001251"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:34.220573" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:34.220775" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:34.220821" 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-11T00:47:34.215241" elapsed="0.005603"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:34.221280" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:34.221355" 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-11T00:47:34.221013" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:34.222172" 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-11T00:47:34.221886" elapsed="0.000357">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:34.221501" elapsed="0.000809">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:34.221483" elapsed="0.000859">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-11T00:47:34.222509" 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-11T00:47:34.222682" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:34.222747" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:34.212762" elapsed="0.010090">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:34.212534" elapsed="0.010386">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:34.212378" elapsed="0.010595">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:34.211987" elapsed="0.011074">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:34.223290" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:34.186222" elapsed="0.037197">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:35.247688" elapsed="0.000240"/>
</kw>
<msg time="2026-04-11T00:47:35.247994" 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-11T00:47:35.247022" elapsed="0.001035"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:35.246562" elapsed="0.001572"/>
</kw>
<msg time="2026-04-11T00:47:35.248179" 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-11T00:47:35.238521" elapsed="0.009702"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:35.238100" elapsed="0.010195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:35.248759" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:35.248504" elapsed="0.000301"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:35.253967" 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-11T00:47:35.253581" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:35.254465" 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-11T00:47:35.254160" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:35.254538" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:47:35.254693" 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-11T00:47:35.253188" elapsed="0.001530"/>
</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-11T00:47:35.254873" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:35.255529" level="INFO">${ds_type} = operational</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-11T00:47:35.255185" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:35.255944" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:35.255708" elapsed="0.000340"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:35.256459" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:35.256198" 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-11T00:47:35.256878" 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-11T00:47:35.257133" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:35.256985" 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-11T00:47:35.257404" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:35.257213" elapsed="0.000249"/>
</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-11T00:47:35.257626" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:35.257485" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:35.256967" elapsed="0.000735"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:35.256713" elapsed="0.001015"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:35.256532" elapsed="0.001224"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:35.257795" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:35.258000" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:35.258046" 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-11T00:47:35.252484" elapsed="0.005586"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:35.258528" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:35.258606" 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-11T00:47:35.258238" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:35.259188" 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-11T00:47:35.258910" elapsed="0.000346">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:35.258698" elapsed="0.000624">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:35.258680" elapsed="0.000673">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-11T00:47:35.259519" 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-11T00:47:35.259691" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:35.259757" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:35.249835" elapsed="0.010035">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:35.249604" elapsed="0.010336">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:35.249461" elapsed="0.010534">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:35.249027" elapsed="0.011057">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:35.260323" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:35.224283" elapsed="0.036176">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:36.285233" elapsed="0.000254"/>
</kw>
<msg time="2026-04-11T00:47:36.285554" 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-11T00:47:36.284592" elapsed="0.001027"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:36.284118" elapsed="0.001579"/>
</kw>
<msg time="2026-04-11T00:47:36.285811" 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-11T00:47:36.276072" elapsed="0.009790"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:36.275665" elapsed="0.010273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:36.286402" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:36.286125" elapsed="0.000339"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:36.291462" 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-11T00:47:36.291063" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:36.291939" 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-11T00:47:36.291648" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:36.292012" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:47:36.292168" 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-11T00:47:36.290691" elapsed="0.001502"/>
</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-11T00:47:36.292343" elapsed="0.000167"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:36.293033" level="INFO">${ds_type} = operational</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-11T00:47:36.292671" elapsed="0.000389"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:36.293475" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:36.293214" elapsed="0.000286"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:36.293888" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:36.293648" elapsed="0.000265"/>
</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-11T00:47:36.294306" 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-11T00:47:36.294622" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:36.294442" elapsed="0.000249"/>
</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-11T00:47:36.294864" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:36.294716" elapsed="0.000201"/>
</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-11T00:47:36.295077" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:36.294940" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:36.294422" elapsed="0.000727"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:36.294135" elapsed="0.001038"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:36.293957" elapsed="0.001240"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:36.295235" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:36.295453" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:36.295499" 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-11T00:47:36.289929" elapsed="0.005599"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:36.295969" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:36.296045" 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-11T00:47:36.295696" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:36.296817" 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-11T00:47:36.296532" elapsed="0.000358">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:36.296136" elapsed="0.000821">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:36.296118" elapsed="0.000906">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-11T00:47:36.297183" 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-11T00:47:36.297355" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:36.297437" elapsed="0.000016"/>
</return>
<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>
<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-11T00:47:36.287462" elapsed="0.010081">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:36.287220" elapsed="0.010392">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:36.287081" elapsed="0.010585">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:36.286690" elapsed="0.011063">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:36.297989" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:36.261345" elapsed="0.036758">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:37.322903" elapsed="0.000258"/>
</kw>
<msg time="2026-04-11T00:47:37.323234" 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-11T00:47:37.322169" elapsed="0.001137"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:37.321704" elapsed="0.001698"/>
</kw>
<msg time="2026-04-11T00:47:37.323452" 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-11T00:47:37.313533" elapsed="0.009964"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:37.313101" elapsed="0.010470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:37.324068" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:37.323805" elapsed="0.000310"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:37.329350" 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-11T00:47:37.328961" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:37.329853" 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-11T00:47:37.329559" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:37.329931" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:47:37.330094" 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-11T00:47:37.328585" elapsed="0.001534"/>
</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-11T00:47:37.330271" elapsed="0.000170"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:37.330960" level="INFO">${ds_type} = operational</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-11T00:47:37.330602" elapsed="0.000386"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:37.331399" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:37.331145" elapsed="0.000282"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:37.331850" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:37.331574" elapsed="0.000301"/>
</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-11T00:47:37.332277" 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-11T00:47:37.332636" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:37.332479" elapsed="0.000239"/>
</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-11T00:47:37.332927" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:37.332752" elapsed="0.000234"/>
</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-11T00:47:37.333152" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:37.333010" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:37.332456" elapsed="0.000770"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:37.332103" elapsed="0.001149"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:37.331922" elapsed="0.001358"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:37.333321" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:37.333547" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:37.333593" 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-11T00:47:37.327863" elapsed="0.005753"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:37.334058" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:37.334135" 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-11T00:47:37.333787" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:37.334780" 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-11T00:47:37.334465" elapsed="0.000397">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:37.334228" elapsed="0.000704">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:37.334210" elapsed="0.000755">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-11T00:47:37.335117" 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-11T00:47:37.335291" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:37.335357" elapsed="0.000017"/>
</return>
<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>
<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-11T00:47:37.325158" elapsed="0.010330">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:37.324917" elapsed="0.010642">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:37.324769" elapsed="0.010845">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:37.324347" elapsed="0.011381">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:37.335968" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:37.299062" elapsed="0.037030">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:38.361328" elapsed="0.000252"/>
</kw>
<msg time="2026-04-11T00:47:38.361646" 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-11T00:47:38.360664" elapsed="0.001043"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:38.360192" elapsed="0.001597"/>
</kw>
<msg time="2026-04-11T00:47:38.361834" 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-11T00:47:38.352161" elapsed="0.009716"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:38.351749" elapsed="0.010200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:38.362471" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:38.362199" elapsed="0.000318"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:38.367552" 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-11T00:47:38.367155" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:38.368034" 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-11T00:47:38.367739" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:38.368109" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:38.368267" 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-11T00:47:38.366682" elapsed="0.001609"/>
</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-11T00:47:38.368458" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:38.369177" level="INFO">${ds_type} = operational</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-11T00:47:38.368792" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:38.369635" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:38.369368" elapsed="0.000293"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:38.370073" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:38.369829" elapsed="0.000269"/>
</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-11T00:47:38.370499" 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-11T00:47:38.370757" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:38.370605" elapsed="0.000213"/>
</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-11T00:47:38.370981" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:38.370843" elapsed="0.000191"/>
</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-11T00:47:38.371200" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:38.371064" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:38.370586" elapsed="0.000686"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:38.370320" elapsed="0.000976"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:38.370144" elapsed="0.001178"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:38.371360" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:47:38.371572" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:38.371617" 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-11T00:47:38.365964" elapsed="0.005675"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:38.372070" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:38.372146" 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-11T00:47:38.371805" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:38.372946" 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-11T00:47:38.372466" elapsed="0.000554">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:38.372237" elapsed="0.000850">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:38.372219" elapsed="0.000900">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-11T00:47:38.373272" 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-11T00:47:38.373458" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:38.373525" elapsed="0.000016"/>
</return>
<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>
<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-11T00:47:38.363507" elapsed="0.010163">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:38.363267" elapsed="0.010473">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:38.363129" elapsed="0.010665">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:38.362739" elapsed="0.011141">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:38.374108" elapsed="0.000031"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:38.337097" elapsed="0.037132">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:39.400033" elapsed="0.000243"/>
</kw>
<msg time="2026-04-11T00:47:39.400344" 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-11T00:47:39.399368" elapsed="0.001059"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:39.398908" elapsed="0.001601"/>
</kw>
<msg time="2026-04-11T00:47:39.400555" 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-11T00:47:39.390815" elapsed="0.009784"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:39.390377" elapsed="0.010294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:39.401122" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:39.400865" elapsed="0.000303"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:39.406255" 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-11T00:47:39.405865" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:39.406758" 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-11T00:47:39.406458" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:39.406832" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:39.406990" 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-11T00:47:39.405483" elapsed="0.001531"/>
</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-11T00:47:39.407165" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:39.407877" level="INFO">${ds_type} = operational</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-11T00:47:39.407518" elapsed="0.000386"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:39.408518" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:39.408062" elapsed="0.000482"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:39.408935" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:39.408695" elapsed="0.000265"/>
</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-11T00:47:39.409356" elapsed="0.000038"/>
</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-11T00:47:39.409631" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:39.409481" elapsed="0.000206"/>
</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-11T00:47:39.409876" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:39.409712" elapsed="0.000298"/>
</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-11T00:47:39.410184" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:39.410036" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:39.409462" elapsed="0.000798"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:39.409191" elapsed="0.001093"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:39.409007" elapsed="0.001304"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:39.410351" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:47:39.410571" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:39.410619" 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-11T00:47:39.404765" elapsed="0.005878"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:39.411086" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:39.411164" 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-11T00:47:39.410814" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:39.411775" 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-11T00:47:39.411491" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:39.411257" elapsed="0.000655">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:39.411239" elapsed="0.000706">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-11T00:47:39.412098" 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-11T00:47:39.412271" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:39.412338" elapsed="0.000018"/>
</return>
<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>
<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-11T00:47:39.402225" elapsed="0.010251">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:39.401970" elapsed="0.010593">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:39.401800" elapsed="0.010819">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:39.401408" elapsed="0.011315">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:39.412958" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:39.375112" elapsed="0.037961">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:40.437873" elapsed="0.000243"/>
</kw>
<msg time="2026-04-11T00:47:40.438184" 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-11T00:47:40.437210" elapsed="0.001041"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:40.436735" elapsed="0.001594"/>
</kw>
<msg time="2026-04-11T00:47:40.438374" 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-11T00:47:40.428592" elapsed="0.009841"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:40.428144" elapsed="0.010362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:40.438996" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:40.438711" elapsed="0.000330"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:40.444471" 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-11T00:47:40.444062" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:40.444948" 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-11T00:47:40.444658" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:40.445022" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:47:40.445190" 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-11T00:47:40.443693" elapsed="0.001525"/>
</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-11T00:47:40.445368" elapsed="0.000171"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:40.446026" level="INFO">${ds_type} = operational</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-11T00:47:40.445695" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:40.446544" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:40.446214" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:40.446987" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:40.446721" elapsed="0.000292"/>
</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-11T00:47:40.447417" elapsed="0.000026"/>
</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-11T00:47:40.447671" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:40.447525" elapsed="0.000215"/>
</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-11T00:47:40.447910" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:40.447765" elapsed="0.000198"/>
</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-11T00:47:40.448124" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:40.447986" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:40.447506" elapsed="0.000691"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:40.447240" elapsed="0.000982"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:40.447059" elapsed="0.001188"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:40.448286" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:40.448501" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:40.448546" 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-11T00:47:40.442951" elapsed="0.005618"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:40.449005" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:40.449080" 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-11T00:47:40.448737" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:40.449683" 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-11T00:47:40.449398" elapsed="0.000362">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:40.449171" elapsed="0.000657">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:40.449153" 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-11T00:47:40.450010" 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-11T00:47:40.450179" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:40.450242" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:40.440084" elapsed="0.010264">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:40.439828" elapsed="0.010605">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:40.439682" elapsed="0.010806">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:40.439276" elapsed="0.011349">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:40.450862" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:40.413962" elapsed="0.037027">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:41.476667" elapsed="0.000237"/>
</kw>
<msg time="2026-04-11T00:47:41.476971" 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-11T00:47:41.476006" elapsed="0.001030"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:41.475532" elapsed="0.001582"/>
</kw>
<msg time="2026-04-11T00:47:41.477159" 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-11T00:47:41.467427" elapsed="0.009776"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:41.466857" elapsed="0.010418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:41.477762" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:41.477498" elapsed="0.000310"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:41.483008" 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-11T00:47:41.482612" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:41.483503" 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-11T00:47:41.483194" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:41.483577" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:41.483734" 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-11T00:47:41.482172" 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-11T00:47:41.483906" elapsed="0.000167"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:41.484576" level="INFO">${ds_type} = operational</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-11T00:47:41.484228" elapsed="0.000375"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:41.484992" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:41.484756" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:41.485413" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:41.485160" elapsed="0.000279"/>
</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-11T00:47:41.485834" elapsed="0.000026"/>
</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-11T00:47:41.486096" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:41.485947" 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-11T00:47:41.486313" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:41.486175" elapsed="0.000190"/>
</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-11T00:47:41.486544" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:41.486403" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:41.485928" elapsed="0.000688"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:41.485665" elapsed="0.000976"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:41.485485" elapsed="0.001244"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:41.486773" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:41.486974" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:41.487020" 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-11T00:47:41.481369" elapsed="0.005673"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:41.487496" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:41.487573" 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-11T00:47:41.487211" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:41.488369" 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-11T00:47:41.487878" elapsed="0.000586">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:41.487665" elapsed="0.000868">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:41.487648" elapsed="0.000919">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-11T00:47:41.488718" 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-11T00:47:41.488887" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:41.488952" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:41.478852" elapsed="0.010206">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:41.478602" elapsed="0.010524">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:41.478439" elapsed="0.010741">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:41.478033" elapsed="0.011235">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:41.489517" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:41.451891" elapsed="0.037741">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:42.518591" elapsed="0.000245"/>
</kw>
<msg time="2026-04-11T00:47:42.518905" 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-11T00:47:42.517922" elapsed="0.001050"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:42.517459" elapsed="0.001592"/>
</kw>
<msg time="2026-04-11T00:47:42.519097" 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-11T00:47:42.509208" elapsed="0.009933"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:42.508512" elapsed="0.010703"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:42.519679" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:42.519421" elapsed="0.000305"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:42.524750" 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-11T00:47:42.524349" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:42.525268" 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-11T00:47:42.524973" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:42.525449" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:47:42.525616" 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-11T00:47:42.523980" elapsed="0.001661"/>
</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-11T00:47:42.525796" elapsed="0.000164"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:42.526681" level="INFO">${ds_type} = operational</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-11T00:47:42.526119" elapsed="0.000590"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:42.527110" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:42.526868" elapsed="0.000268"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:42.527540" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:42.527284" elapsed="0.000282"/>
</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-11T00:47:42.527963" 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-11T00:47:42.528220" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:42.528071" 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-11T00:47:42.528455" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:42.528301" elapsed="0.000210"/>
</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-11T00:47:42.528675" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:42.528535" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:42.528052" elapsed="0.000697"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:42.527798" elapsed="0.000976"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:42.527614" elapsed="0.001186"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:42.528840" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:42.529050" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:42.529096" 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-11T00:47:42.523251" elapsed="0.005869"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:42.529579" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:42.529655" 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-11T00:47:42.529289" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:42.530247" 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-11T00:47:42.529962" elapsed="0.000360">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:42.529747" elapsed="0.000660">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:42.529729" elapsed="0.000712">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-11T00:47:42.530593" 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-11T00:47:42.530762" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:42.530827" elapsed="0.000016"/>
</return>
<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>
<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-11T00:47:42.520738" elapsed="0.010198">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:42.520505" elapsed="0.010502">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:42.520346" elapsed="0.010716">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:42.519952" elapsed="0.011198">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:42.531393" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:42.490505" elapsed="0.041046">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:43.556410" elapsed="0.000245"/>
</kw>
<msg time="2026-04-11T00:47:43.556723" 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-11T00:47:43.555741" elapsed="0.001048"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:43.555266" elapsed="0.001602"/>
</kw>
<msg time="2026-04-11T00:47:43.556915" 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-11T00:47:43.547225" elapsed="0.009735"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:43.546803" elapsed="0.010233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:43.557507" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:43.557232" elapsed="0.000321"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:43.562827" 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-11T00:47:43.562436" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:43.563303" 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-11T00:47:43.563015" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:43.563377" elapsed="0.000050"/>
</return>
<msg time="2026-04-11T00:47:43.563556" 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-11T00:47:43.562046" elapsed="0.001534"/>
</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-11T00:47:43.563731" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:43.564372" level="INFO">${ds_type} = operational</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-11T00:47:43.564042" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:43.564806" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:43.564570" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:43.565217" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:43.564975" elapsed="0.000267"/>
</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-11T00:47:43.565650" 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-11T00:47:43.565928" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:43.565756" elapsed="0.000229"/>
</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-11T00:47:43.566150" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:43.566011" elapsed="0.000192"/>
</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-11T00:47:43.566362" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:43.566225" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:43.565738" elapsed="0.000717"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:43.565480" elapsed="0.000999"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:43.565287" elapsed="0.001217"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:43.566543" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:43.566742" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:43.566788" 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-11T00:47:43.561308" elapsed="0.005503"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:43.567329" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:43.567422" 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-11T00:47:43.567049" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:43.568013" 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-11T00:47:43.567732" elapsed="0.000352">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:43.567516" elapsed="0.000635">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:43.567499" elapsed="0.000684">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-11T00:47:43.568336" 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-11T00:47:43.568527" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:43.568594" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:43.558600" elapsed="0.010100">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:43.558352" elapsed="0.010418">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:43.558210" elapsed="0.010613">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:43.557779" elapsed="0.011132">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:43.569138" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:43.532442" elapsed="0.036810">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:44.603471" elapsed="0.000347"/>
</kw>
<msg time="2026-04-11T00:47:44.603886" 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-11T00:47:44.602496" elapsed="0.001458"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:44.601786" elapsed="0.002248"/>
</kw>
<msg time="2026-04-11T00:47:44.604081" 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-11T00:47:44.588596" elapsed="0.015530"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:44.587634" elapsed="0.016567"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:44.604676" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:44.604414" elapsed="0.000307"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:44.613345" 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-11T00:47:44.612620" elapsed="0.000758"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:44.614092" 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-11T00:47:44.613673" elapsed="0.000593"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:44.614329" elapsed="0.000135"/>
</return>
<msg time="2026-04-11T00:47:44.614722" 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-11T00:47:44.611784" elapsed="0.002965"/>
</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-11T00:47:44.615028" elapsed="0.000169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:44.616099" level="INFO">${ds_type} = operational</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-11T00:47:44.615404" elapsed="0.000762"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:44.617133" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:44.616798" elapsed="0.000392"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:44.617982" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:44.617344" elapsed="0.000705"/>
</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-11T00:47:44.618728" elapsed="0.000026"/>
</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-11T00:47:44.619184" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:44.618869" elapsed="0.000381"/>
</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-11T00:47:44.619562" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:44.619342" elapsed="0.000278"/>
</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-11T00:47:44.619787" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:44.619644" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:44.618822" elapsed="0.001041"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:44.618552" elapsed="0.001335"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:44.618135" elapsed="0.001779"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:44.620127" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:47:44.620472" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:44.620523" 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-11T00:47:44.610453" elapsed="0.010094"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:44.621570" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:44.621656" 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-11T00:47:44.620877" elapsed="0.000891"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:44.623320" 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-11T00:47:44.622591" elapsed="0.000822">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:44.621841" elapsed="0.001641">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:44.621821" elapsed="0.001693">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-11T00:47:44.623665" 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-11T00:47:44.623836" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:44.623900" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:44.606173" elapsed="0.017832">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:44.605780" elapsed="0.018291">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:44.605465" elapsed="0.018660">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:44.604949" elapsed="0.019260">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:44.624453" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:44.570149" elapsed="0.054419">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:45.647221" elapsed="0.000261"/>
</kw>
<msg time="2026-04-11T00:47:45.647553" 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-11T00:47:45.646570" elapsed="0.001053"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:45.646096" elapsed="0.001717"/>
</kw>
<msg time="2026-04-11T00:47:45.647860" 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-11T00:47:45.638071" elapsed="0.009834"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:45.637664" elapsed="0.010320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:45.648444" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:45.648171" elapsed="0.000319"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:45.653617" 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-11T00:47:45.653216" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:45.654086" 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-11T00:47:45.653803" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:45.654160" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:47:45.654318" 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-11T00:47:45.652852" elapsed="0.001490"/>
</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-11T00:47:45.654508" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:45.655147" level="INFO">${ds_type} = operational</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-11T00:47:45.654819" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:45.655581" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:45.655327" elapsed="0.000280"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:45.656043" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:45.655790" elapsed="0.000280"/>
</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-11T00:47:45.656487" 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-11T00:47:45.656752" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:45.656602" 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-11T00:47:45.656973" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:45.656831" 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-11T00:47:45.657187" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:45.657048" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:45.656582" elapsed="0.000677"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:45.656299" elapsed="0.000984"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:45.656117" elapsed="0.001191"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:45.657348" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:45.657571" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:45.657616" 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-11T00:47:45.652132" elapsed="0.005512"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:45.658088" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:45.658164" 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-11T00:47:45.657815" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:45.658767" 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-11T00:47:45.658484" elapsed="0.000359">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:45.658254" elapsed="0.000698">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:45.658237" elapsed="0.000748">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-11T00:47:45.659136" 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-11T00:47:45.659308" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:45.659374" elapsed="0.000032"/>
</return>
<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>
<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-11T00:47:45.649499" elapsed="0.010000">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:45.649251" elapsed="0.010317">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:45.649109" elapsed="0.010514">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:45.648713" elapsed="0.010997">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:45.659960" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:45.625501" elapsed="0.034573">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:46.687824" elapsed="0.000240"/>
</kw>
<msg time="2026-04-11T00:47:46.688131" 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-11T00:47:46.687163" elapsed="0.001045"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:46.686694" elapsed="0.001594"/>
</kw>
<msg time="2026-04-11T00:47:46.688333" 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-11T00:47:46.678200" elapsed="0.010178"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:46.677786" elapsed="0.010679"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:46.688962" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:46.688685" elapsed="0.000329"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:46.694093" 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-11T00:47:46.693665" elapsed="0.000457"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:46.694592" 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-11T00:47:46.694284" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:46.694667" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:46.694826" 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-11T00:47:46.693264" elapsed="0.001587"/>
</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-11T00:47:46.695004" elapsed="0.000190"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:46.695832" level="INFO">${ds_type} = operational</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-11T00:47:46.695406" elapsed="0.000460"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:46.696320" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:46.696056" elapsed="0.000299"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:46.696821" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:46.696525" elapsed="0.000322"/>
</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-11T00:47:46.697315" elapsed="0.000026"/>
</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-11T00:47:46.697627" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:46.697461" elapsed="0.000227"/>
</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-11T00:47:46.697857" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:46.697715" 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-11T00:47:46.698084" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:46.697940" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:46.697435" elapsed="0.000727"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:46.697082" elapsed="0.001105"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:46.696895" elapsed="0.001319"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:46.698256" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:46.698482" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:46.698545" 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-11T00:47:46.692525" elapsed="0.006047"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:46.699043" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:46.699121" 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-11T00:47:46.698767" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:46.701514" 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-11T00:47:46.701198" elapsed="0.000390">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:46.700956" elapsed="0.000703">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:46.699197" elapsed="0.002497">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-11T00:47:46.701851" elapsed="0.000023"/>
</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-11T00:47:46.702045" elapsed="0.000024"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:46.702117" elapsed="0.000017"/>
</return>
<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>
<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-11T00:47:46.690029" elapsed="0.012200">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:46.689801" elapsed="0.012501">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:46.689655" elapsed="0.012705">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:46.689244" elapsed="0.013226">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:46.702708" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:46.661042" elapsed="0.041787">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:47.732021" elapsed="0.000277"/>
</kw>
<msg time="2026-04-11T00:47:47.732370" 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-11T00:47:47.731310" elapsed="0.001148"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:47.730819" elapsed="0.001723"/>
</kw>
<msg time="2026-04-11T00:47:47.732590" 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-11T00:47:47.722473" elapsed="0.010163"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:47.721937" elapsed="0.010870"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:47.733273" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:47.733009" elapsed="0.000311"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:47.739000" 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-11T00:47:47.738568" elapsed="0.000461"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:47.739507" 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-11T00:47:47.739195" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:47.739584" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:47:47.739747" 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-11T00:47:47.738167" elapsed="0.001605"/>
</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-11T00:47:47.739929" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:47.740608" level="INFO">${ds_type} = operational</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-11T00:47:47.740250" elapsed="0.000386"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:47.741040" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:47.740796" elapsed="0.000271"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:47.741473" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:47.741215" elapsed="0.000301"/>
</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-11T00:47:47.741938" 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-11T00:47:47.742194" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:47.742046" 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-11T00:47:47.742426" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:47.742272" elapsed="0.000208"/>
</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-11T00:47:47.742649" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:47.742503" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:47.742027" elapsed="0.000694"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:47.741773" elapsed="0.000971"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:47.741570" elapsed="0.001199"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:47.742808" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:47.743005" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:47.743051" 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-11T00:47:47.737354" elapsed="0.005720"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:47.743527" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:47.743603" 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-11T00:47:47.743242" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:47.744191" 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-11T00:47:47.743909" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:47.743693" elapsed="0.000637">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:47.743676" 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-11T00:47:47.744531" 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-11T00:47:47.744704" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:47.744820" elapsed="0.000016"/>
</return>
<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>
<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-11T00:47:47.734373" elapsed="0.010555">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:47.734132" elapsed="0.010866">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:47.733983" elapsed="0.011071">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:47.733583" elapsed="0.011561">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:47.745394" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:47.703822" elapsed="0.041728">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:48.772276" elapsed="0.000260"/>
</kw>
<msg time="2026-04-11T00:47:48.772603" 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-11T00:47:48.771629" elapsed="0.001038"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:48.771155" elapsed="0.001591"/>
</kw>
<msg time="2026-04-11T00:47:48.772792" 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-11T00:47:48.762937" elapsed="0.009899"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:48.762265" elapsed="0.010645"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:48.773358" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:48.773103" elapsed="0.000317"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:48.778443" 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-11T00:47:48.778013" elapsed="0.000459"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:48.778920" 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-11T00:47:48.778630" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:48.778996" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:48.779158" 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-11T00:47:48.777648" elapsed="0.001534"/>
</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-11T00:47:48.779330" elapsed="0.000171"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:48.779987" level="INFO">${ds_type} = operational</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-11T00:47:48.779658" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:48.780417" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:48.780168" elapsed="0.000276"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:48.780819" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:48.780589" elapsed="0.000256"/>
</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-11T00:47:48.781233" 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-11T00:47:48.781503" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:48.781339" elapsed="0.000301"/>
</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-11T00:47:48.781812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:48.781669" elapsed="0.000197"/>
</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-11T00:47:48.782032" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:48.781889" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:48.781320" elapsed="0.000795"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:48.781071" elapsed="0.001068"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:48.780890" elapsed="0.001274"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:48.782204" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:48.782430" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:48.782477" 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-11T00:47:48.776924" elapsed="0.005576"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:48.782939" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:48.783015" 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-11T00:47:48.782669" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:48.783806" 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-11T00:47:48.783320" elapsed="0.000559">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:48.783106" elapsed="0.000842">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:48.783089" elapsed="0.000892">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-11T00:47:48.784133" 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-11T00:47:48.784313" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:48.784395" elapsed="0.000017"/>
</return>
<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>
<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-11T00:47:48.774436" elapsed="0.010068">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:48.774180" elapsed="0.010395">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:48.774034" elapsed="0.010596">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:48.773641" elapsed="0.011078">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:48.784950" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:48.746580" elapsed="0.038485">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:49.813507" elapsed="0.000251"/>
</kw>
<msg time="2026-04-11T00:47:49.813828" 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-11T00:47:49.812848" elapsed="0.001050"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:49.812377" elapsed="0.001600"/>
</kw>
<msg time="2026-04-11T00:47:49.814023" 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-11T00:47:49.804317" elapsed="0.009751"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:49.803751" elapsed="0.010389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:49.814608" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:49.814335" elapsed="0.000318"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:49.819815" 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-11T00:47:49.819427" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:49.820292" 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-11T00:47:49.820003" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:49.820369" elapsed="0.000048"/>
</return>
<msg time="2026-04-11T00:47:49.820546" 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-11T00:47:49.819015" elapsed="0.001556"/>
</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-11T00:47:49.820722" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:49.821394" level="INFO">${ds_type} = operational</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-11T00:47:49.821036" elapsed="0.000386"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:49.822023" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:49.821580" elapsed="0.000469"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:49.822453" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:49.822198" elapsed="0.000281"/>
</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-11T00:47:49.822875" 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-11T00:47:49.823134" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:49.822985" elapsed="0.000223"/>
</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-11T00:47:49.823375" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:49.823235" elapsed="0.000210"/>
</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-11T00:47:49.823610" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:49.823468" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:49.822965" elapsed="0.000719"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:49.822709" elapsed="0.000999"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:49.822528" elapsed="0.001207"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:49.823775" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:49.823974" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:49.824020" 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-11T00:47:49.818287" elapsed="0.005756"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:49.824498" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:49.824574" 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-11T00:47:49.824213" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:49.825163" 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-11T00:47:49.824880" elapsed="0.000360">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:49.824665" elapsed="0.000643">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:49.824648" 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-11T00:47:49.825507" 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-11T00:47:49.825680" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:49.825745" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:49.815791" elapsed="0.010060">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:49.815555" elapsed="0.010405">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:49.815406" elapsed="0.010611">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:49.814977" elapsed="0.011130">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:49.826338" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:49.786003" elapsed="0.040468">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:50.851331" elapsed="0.000259"/>
</kw>
<msg time="2026-04-11T00:47:50.851659" 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-11T00:47:50.850690" elapsed="0.001033"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:50.850218" elapsed="0.001584"/>
</kw>
<msg time="2026-04-11T00:47:50.851849" 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-11T00:47:50.842135" elapsed="0.009757"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:50.841713" elapsed="0.010291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:50.852489" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:50.852212" elapsed="0.000322"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:50.857777" 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-11T00:47:50.857374" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:50.858248" 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-11T00:47:50.857963" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:50.858322" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:50.858498" 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-11T00:47:50.857000" elapsed="0.001523"/>
</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-11T00:47:50.858673" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:50.859327" level="INFO">${ds_type} = operational</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-11T00:47:50.858990" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:50.859766" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:50.859527" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:50.860211" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:50.859938" elapsed="0.000300"/>
</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-11T00:47:50.860656" 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-11T00:47:50.860912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:50.860765" 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-11T00:47:50.861131" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:50.860993" elapsed="0.000192"/>
</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-11T00:47:50.861344" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:50.861208" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:50.860745" elapsed="0.000784"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:50.860484" elapsed="0.001073"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:50.860285" elapsed="0.001299"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:50.861625" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:47:50.861830" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:50.861876" 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-11T00:47:50.856279" elapsed="0.005620"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:50.862342" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:50.862443" 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-11T00:47:50.862070" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:50.863066" 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-11T00:47:50.862776" elapsed="0.000365">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:50.862554" elapsed="0.000655">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:50.862530" elapsed="0.000711">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-11T00:47:50.863408" elapsed="0.000023"/>
</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-11T00:47:50.863584" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:50.863649" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:50.853540" elapsed="0.010215">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:50.853292" elapsed="0.010534">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:50.853149" elapsed="0.010732">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:50.852759" elapsed="0.011229">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:50.864244" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:50.827523" elapsed="0.036839">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:51.888318" elapsed="0.000259"/>
</kw>
<msg time="2026-04-11T00:47:51.888644" 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-11T00:47:51.887678" elapsed="0.001029"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:51.887201" elapsed="0.001620"/>
</kw>
<msg time="2026-04-11T00:47:51.888868" 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-11T00:47:51.879115" elapsed="0.009799"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:51.878705" elapsed="0.010283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:51.889470" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:51.889195" elapsed="0.000321"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:51.895164" 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-11T00:47:51.894620" elapsed="0.000582"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:51.895953" 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-11T00:47:51.895533" elapsed="0.000458"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:51.896057" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:47:51.896276" 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-11T00:47:51.894081" elapsed="0.002231"/>
</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-11T00:47:51.896545" elapsed="0.000258"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:51.897467" level="INFO">${ds_type} = operational</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-11T00:47:51.897028" elapsed="0.000466"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:51.897890" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:51.897651" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:51.898303" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:51.898063" elapsed="0.000266"/>
</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-11T00:47:51.898748" 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-11T00:47:51.899003" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:51.898855" 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-11T00:47:51.899220" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:51.899082" elapsed="0.000191"/>
</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-11T00:47:51.899451" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:51.899296" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:51.898837" elapsed="0.000688"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:51.898582" elapsed="0.000966"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:51.898377" elapsed="0.001196"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:51.899612" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:51.899808" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:51.899853" 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-11T00:47:51.893041" elapsed="0.006835"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:51.900306" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:51.900381" 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-11T00:47:51.900042" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:51.901270" 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-11T00:47:51.900928" elapsed="0.000430">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:51.900488" elapsed="0.000959">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:51.900470" elapsed="0.001009">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-11T00:47:51.901640" 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-11T00:47:51.901856" elapsed="0.000026"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:51.901936" elapsed="0.000019"/>
</return>
<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>
<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-11T00:47:51.890516" elapsed="0.011556">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:51.890271" elapsed="0.011884">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:51.890131" elapsed="0.012094">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:51.889739" elapsed="0.012593">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:51.902636" elapsed="0.000069"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:51.865311" elapsed="0.037516">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:52.928682" elapsed="0.000246"/>
</kw>
<msg time="2026-04-11T00:47:52.929000" 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-11T00:47:52.927967" elapsed="0.001099"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:52.927503" elapsed="0.001647"/>
</kw>
<msg time="2026-04-11T00:47:52.929197" 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-11T00:47:52.918944" elapsed="0.010299"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:52.918515" elapsed="0.010806"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:52.929881" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:52.929609" elapsed="0.000318"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:52.936439" 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-11T00:47:52.935918" elapsed="0.000559"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:52.937078" 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-11T00:47:52.936694" elapsed="0.000419"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:52.937176" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:47:52.937412" 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-11T00:47:52.935436" elapsed="0.002011"/>
</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-11T00:47:52.937694" elapsed="0.000207"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:52.938594" level="INFO">${ds_type} = operational</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-11T00:47:52.938117" elapsed="0.000514"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:52.939169" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:52.938841" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:52.939715" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:52.939413" elapsed="0.000334"/>
</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-11T00:47:52.940254" 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-11T00:47:52.940627" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:52.940416" elapsed="0.000288"/>
</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-11T00:47:52.940935" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:52.940741" elapsed="0.000269"/>
</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-11T00:47:52.941235" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:52.941044" elapsed="0.000261"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:52.940372" elapsed="0.000963"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:52.940038" elapsed="0.001328"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:52.939808" elapsed="0.001613"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:52.941474" elapsed="0.000037"/>
</return>
<msg time="2026-04-11T00:47:52.941756" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:52.941819" 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-11T00:47:52.934485" elapsed="0.007366"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:52.942540" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:52.942644" 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-11T00:47:52.942153" elapsed="0.000524"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:52.943644" 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-11T00:47:52.943059" elapsed="0.000680">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:52.942770" elapsed="0.001059">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:52.942744" elapsed="0.001129">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-11T00:47:52.944082" elapsed="0.000030"/>
</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-11T00:47:52.944317" elapsed="0.000029"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:52.944429" elapsed="0.000024"/>
</return>
<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>
<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-11T00:47:52.930951" elapsed="0.013626">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:52.930715" elapsed="0.013958">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:52.930571" elapsed="0.014178">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:52.930153" elapsed="0.014722">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:52.945202" elapsed="0.000034"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:52.903758" elapsed="0.041597">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:53.975721" elapsed="0.000241"/>
</kw>
<msg time="2026-04-11T00:47:53.976038" 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-11T00:47:53.975056" elapsed="0.001049"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:53.974598" elapsed="0.001587"/>
</kw>
<msg time="2026-04-11T00:47:53.976230" 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-11T00:47:53.966567" elapsed="0.009705"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:53.966119" elapsed="0.010225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:53.976815" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:53.976552" elapsed="0.000308"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:53.981898" 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-11T00:47:53.981510" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:53.982414" 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-11T00:47:53.982082" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:53.982489" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:53.982646" 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-11T00:47:53.981124" elapsed="0.001546"/>
</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-11T00:47:53.982897" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:53.983570" level="INFO">${ds_type} = operational</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-11T00:47:53.983219" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:53.983991" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:53.983753" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:53.984409" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:53.984161" elapsed="0.000274"/>
</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-11T00:47:53.984836" 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-11T00:47:53.985090" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:53.984944" 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-11T00:47:53.985320" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:53.985179" 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-11T00:47:53.985557" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:53.985412" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:53.984925" elapsed="0.000707"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:53.984670" elapsed="0.000985"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:53.984482" elapsed="0.001200"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:53.985720" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:53.985917" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:53.985963" 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-11T00:47:53.980417" elapsed="0.005569"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:53.986454" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:53.986543" 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-11T00:47:53.986154" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:53.987320" 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-11T00:47:53.987020" elapsed="0.000400">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:53.986636" elapsed="0.000856">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:53.986618" elapsed="0.000905">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-11T00:47:53.987674" 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-11T00:47:53.987846" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:53.987910" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:53.977876" elapsed="0.010140">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:53.977637" elapsed="0.010446">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:53.977496" elapsed="0.010642">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:53.977085" elapsed="0.011147">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:53.988476" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:53.950547" elapsed="0.038045">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:55.013911" elapsed="0.000245"/>
</kw>
<msg time="2026-04-11T00:47:55.014223" 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-11T00:47:55.013157" elapsed="0.001132"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:55.012706" elapsed="0.001670"/>
</kw>
<msg time="2026-04-11T00:47:55.014446" 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-11T00:47:55.004681" elapsed="0.009811"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:55.004257" elapsed="0.010310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:55.015025" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:55.014757" elapsed="0.000314"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:55.020872" 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-11T00:47:55.020469" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:55.021349" 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-11T00:47:55.021062" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:55.021443" elapsed="0.000035"/>
</return>
<msg time="2026-04-11T00:47:55.021609" 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-11T00:47:55.020028" elapsed="0.001605"/>
</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-11T00:47:55.021788" elapsed="0.000174"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:55.022476" level="INFO">${ds_type} = operational</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-11T00:47:55.022123" elapsed="0.000380"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:55.022897" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:55.022660" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:55.023338" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:55.023098" elapsed="0.000265"/>
</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-11T00:47:55.023779" 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-11T00:47:55.024039" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:55.023888" 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-11T00:47:55.024256" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:55.024118" elapsed="0.000191"/>
</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-11T00:47:55.024490" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:55.024332" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:55.023869" elapsed="0.000697"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:55.023615" elapsed="0.000975"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:55.023434" elapsed="0.001183"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:55.024656" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:55.024854" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:55.024899" 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-11T00:47:55.019209" elapsed="0.005713"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:55.025359" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:55.025451" 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-11T00:47:55.025089" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:55.026078" 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-11T00:47:55.025799" elapsed="0.000349">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:55.025582" elapsed="0.000637">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:55.025565" elapsed="0.000685">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-11T00:47:55.026416" elapsed="0.000023"/>
</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-11T00:47:55.026589" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:55.026655" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:55.016085" elapsed="0.010675">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:55.015854" elapsed="0.010974">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:55.015712" elapsed="0.011177">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:55.015295" elapsed="0.011681">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:55.027235" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:54.989524" elapsed="0.037826">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:56.054857" elapsed="0.000245"/>
</kw>
<msg time="2026-04-11T00:47:56.055173" 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-11T00:47:56.054193" elapsed="0.001047"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:56.053734" elapsed="0.001584"/>
</kw>
<msg time="2026-04-11T00:47:56.055363" 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-11T00:47:56.045660" elapsed="0.009763"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:56.045222" elapsed="0.010274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:56.055957" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:56.055689" elapsed="0.000313"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:56.060939" 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-11T00:47:56.060555" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:56.061427" 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-11T00:47:56.061123" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:56.061503" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:56.061660" 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-11T00:47:56.060174" elapsed="0.001511"/>
</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-11T00:47:56.061836" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:56.062498" level="INFO">${ds_type} = operational</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-11T00:47:56.062146" elapsed="0.000379"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:56.062915" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:56.062680" elapsed="0.000324"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:56.063406" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:56.063153" elapsed="0.000280"/>
</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-11T00:47:56.063841" 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-11T00:47:56.064094" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:56.063947" 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-11T00:47:56.064316" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:56.064174" 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-11T00:47:56.064555" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:56.064407" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:56.063928" elapsed="0.000701"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:56.063656" elapsed="0.000997"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:56.063480" elapsed="0.001201"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:56.064720" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:47:56.064918" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:56.064964" 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-11T00:47:56.059454" elapsed="0.005532"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:56.065438" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:56.065515" 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-11T00:47:56.065153" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:56.066282" 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-11T00:47:56.065821" elapsed="0.000533">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:56.065606" elapsed="0.000831">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:56.065589" elapsed="0.000881">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-11T00:47:56.066621" 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-11T00:47:56.066794" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:56.066858" elapsed="0.000016"/>
</return>
<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>
<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-11T00:47:56.057000" elapsed="0.009963">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:56.056772" elapsed="0.010259">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:56.056631" elapsed="0.010453">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:56.056223" elapsed="0.010947">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:56.067414" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:56.028294" elapsed="0.039235">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:57.095551" elapsed="0.000255"/>
</kw>
<msg time="2026-04-11T00:47:57.095888" 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-11T00:47:57.094846" elapsed="0.001112"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:57.094344" elapsed="0.001696"/>
</kw>
<msg time="2026-04-11T00:47:57.096189" 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-11T00:47:57.085615" elapsed="0.010622"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:57.084962" elapsed="0.011351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:57.096832" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:57.096540" elapsed="0.000339"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:57.101979" 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-11T00:47:57.101586" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:57.102484" 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-11T00:47:57.102168" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:57.102560" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:47:57.102722" 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-11T00:47:57.101185" elapsed="0.001562"/>
</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-11T00:47:57.102898" elapsed="0.000160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:57.103575" level="INFO">${ds_type} = operational</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-11T00:47:57.103218" elapsed="0.000383"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:57.104204" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:57.103759" elapsed="0.000472"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:57.104679" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:57.104401" elapsed="0.000305"/>
</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-11T00:47:57.105110" elapsed="0.000044"/>
</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-11T00:47:57.105442" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:57.105253" elapsed="0.000249"/>
</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-11T00:47:57.105680" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:57.105537" elapsed="0.000198"/>
</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-11T00:47:57.105900" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:57.105758" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:57.105229" elapsed="0.000748"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:57.104941" elapsed="0.001060"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:57.104754" elapsed="0.001273"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:57.106068" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:47:57.106275" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:57.106323" 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-11T00:47:57.100426" elapsed="0.005922"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:57.106817" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:57.106898" 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-11T00:47:57.106539" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:57.107519" 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-11T00:47:57.107214" elapsed="0.000380">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:57.106994" elapsed="0.000669">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:57.106975" elapsed="0.000755">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-11T00:47:57.107889" 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-11T00:47:57.108063" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:57.108130" elapsed="0.000016"/>
</return>
<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>
<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-11T00:47:57.097921" elapsed="0.010317">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:57.097685" elapsed="0.010624">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:57.097537" elapsed="0.010827">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:57.097109" elapsed="0.011410">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:57.108763" elapsed="0.000032"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:57.068631" elapsed="0.040260">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:58.133119" elapsed="0.000256"/>
</kw>
<msg time="2026-04-11T00:47:58.133459" 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-11T00:47:58.132475" elapsed="0.001052"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:58.131994" elapsed="0.001612"/>
</kw>
<msg time="2026-04-11T00:47:58.133650" 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-11T00:47:58.123881" elapsed="0.009813"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:58.123469" elapsed="0.010297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:58.134215" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:58.133960" elapsed="0.000300"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:58.139529" 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-11T00:47:58.139122" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:58.140004" 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-11T00:47:58.139718" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:58.140078" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:58.140238" 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-11T00:47:58.138750" elapsed="0.001512"/>
</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-11T00:47:58.140445" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:58.141139" level="INFO">${ds_type} = operational</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-11T00:47:58.140795" elapsed="0.000383"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:58.141588" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:58.141333" elapsed="0.000280"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:58.141993" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:58.141759" elapsed="0.000266"/>
</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-11T00:47:58.142442" 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-11T00:47:58.142774" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:58.142626" 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-11T00:47:58.142996" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:58.142856" elapsed="0.000194"/>
</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-11T00:47:58.143214" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:58.143074" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:58.142606" elapsed="0.000682"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:58.142253" elapsed="0.001060"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:58.142070" elapsed="0.001269"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:58.143377" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:47:58.143600" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:58.143646" 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-11T00:47:58.138028" elapsed="0.005641"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:58.144106" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:58.144182" 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-11T00:47:58.143838" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:58.144782" 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-11T00:47:58.144503" elapsed="0.000351">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:58.144272" elapsed="0.000647">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:58.144255" 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-11T00:47:58.145102" 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-11T00:47:58.145302" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:58.145370" elapsed="0.000030"/>
</return>
<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>
<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-11T00:47:58.135275" elapsed="0.010218">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:58.135038" elapsed="0.010526">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:58.134894" elapsed="0.010726">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:58.134501" elapsed="0.011209">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:58.145949" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:58.109886" elapsed="0.036178">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:47:59.171713" elapsed="0.000235"/>
</kw>
<msg time="2026-04-11T00:47:59.172015" 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-11T00:47:59.171056" elapsed="0.001024"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:59.170593" elapsed="0.001565"/>
</kw>
<msg time="2026-04-11T00:47:59.172203" 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-11T00:47:59.162537" elapsed="0.009710"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:47:59.162112" elapsed="0.010207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:47:59.172849" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:47:59.172589" elapsed="0.000306"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:47:59.177898" 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-11T00:47:59.177492" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:59.178372" 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-11T00:47:59.178085" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:47:59.178463" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:47:59.178621" 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-11T00:47:59.177109" elapsed="0.001537"/>
</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-11T00:47:59.178796" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:47:59.179464" level="INFO">${ds_type} = operational</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-11T00:47:59.179113" elapsed="0.000379"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:59.179890" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:59.179650" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:47:59.180298" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:47:59.180064" elapsed="0.000259"/>
</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-11T00:47:59.180727" 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-11T00:47:59.180980" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:59.180834" 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-11T00:47:59.181200" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:59.181061" 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-11T00:47:59.181431" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:47:59.181277" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:47:59.180815" elapsed="0.000692"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:47:59.180564" elapsed="0.000967"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:59.180370" elapsed="0.001186"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:47:59.181595" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:47:59.181793" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:47:59.181840" 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-11T00:47:59.176399" elapsed="0.005477"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:47:59.182310" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:47:59.182408" 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-11T00:47:59.182045" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:47:59.183183" 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-11T00:47:59.182715" elapsed="0.000538">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:47:59.182501" elapsed="0.000819">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:47:59.182484" elapsed="0.000868">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-11T00:47:59.183521" elapsed="0.000023"/>
</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-11T00:47:59.183699" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:47:59.183766" elapsed="0.000015"/>
</return>
<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>
<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-11T00:47:59.173917" elapsed="0.009988">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:47:59.173675" elapsed="0.010302">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:47:59.173533" elapsed="0.010500">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:47:59.173119" elapsed="0.011003">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:47:59.184352" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:59.146961" elapsed="0.037545">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:00.209703" elapsed="0.000243"/>
</kw>
<msg time="2026-04-11T00:48:00.210015" 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-11T00:48:00.209033" elapsed="0.001047"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:00.208543" elapsed="0.001616"/>
</kw>
<msg time="2026-04-11T00:48:00.210205" 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-11T00:48:00.200510" elapsed="0.009739"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:00.200079" elapsed="0.010243"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:00.210813" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:00.210552" elapsed="0.000306"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:00.215862" 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-11T00:48:00.215478" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:00.216330" 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-11T00:48:00.216047" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:00.216425" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:00.216589" 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-11T00:48:00.215094" elapsed="0.001520"/>
</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-11T00:48:00.216771" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:00.217627" level="INFO">${ds_type} = operational</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-11T00:48:00.217082" elapsed="0.000573"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:00.218053" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:00.217813" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:00.218481" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:00.218225" elapsed="0.000282"/>
</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-11T00:48:00.218924" 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-11T00:48:00.219180" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:00.219033" 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-11T00:48:00.219417" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:00.219259" elapsed="0.000281"/>
</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-11T00:48:00.219711" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:00.219565" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:00.219014" elapsed="0.000773"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:00.218759" elapsed="0.001053"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:00.218576" elapsed="0.001262"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:00.219878" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:48:00.220079" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:00.220125" 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-11T00:48:00.214357" elapsed="0.005791"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:00.220604" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:00.220680" 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-11T00:48:00.220317" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:00.221302" 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-11T00:48:00.221012" elapsed="0.000362">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:00.220772" elapsed="0.000688">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:00.220755" elapsed="0.000738">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-11T00:48:00.221646" 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-11T00:48:00.221839" elapsed="0.000029"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:00.221924" elapsed="0.000017"/>
</return>
<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>
<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-11T00:48:00.211871" elapsed="0.010163">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:00.211639" elapsed="0.010466">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:00.211493" elapsed="0.010668">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:00.211082" elapsed="0.011168">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:00.222501" elapsed="0.000035"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:00.185474" elapsed="0.037155">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:01.247331" elapsed="0.000262"/>
</kw>
<msg time="2026-04-11T00:48:01.247661" 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-11T00:48:01.246645" elapsed="0.001080"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:01.246141" elapsed="0.001663"/>
</kw>
<msg time="2026-04-11T00:48:01.247850" 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-11T00:48:01.237888" elapsed="0.010007"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:01.237463" elapsed="0.010507"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:01.248455" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:01.248158" elapsed="0.000344"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:01.254091" 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-11T00:48:01.253708" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:01.254578" 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-11T00:48:01.254276" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:01.254651" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:01.254808" 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-11T00:48:01.253322" elapsed="0.001511"/>
</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-11T00:48:01.254981" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:01.255710" level="INFO">${ds_type} = operational</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-11T00:48:01.255316" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:01.256135" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:01.255896" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:01.256622" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:01.256323" elapsed="0.000329"/>
</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-11T00:48:01.257103" elapsed="0.000028"/>
</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-11T00:48:01.257377" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:01.257227" elapsed="0.000233"/>
</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-11T00:48:01.257629" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:01.257485" elapsed="0.000198"/>
</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-11T00:48:01.257852" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:01.257706" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:01.257203" elapsed="0.000725"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:01.256914" elapsed="0.001038"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:01.256704" elapsed="0.001273"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:01.258015" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:48:01.258214" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:01.258259" 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-11T00:48:01.252602" elapsed="0.005679"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:01.258736" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:01.258812" 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-11T00:48:01.258467" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:01.259460" 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-11T00:48:01.259124" elapsed="0.000417">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:01.258904" elapsed="0.000704">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:01.258886" elapsed="0.000754">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-11T00:48:01.259789" 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-11T00:48:01.259958" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:01.260022" elapsed="0.000016"/>
</return>
<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>
<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-11T00:48:01.249530" elapsed="0.010597">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:01.249265" elapsed="0.010930">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:01.249124" elapsed="0.011125">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:01.248730" elapsed="0.011678">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:01.260644" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:01.223531" elapsed="0.037228">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:02.286082" elapsed="0.000234"/>
</kw>
<msg time="2026-04-11T00:48:02.286396" 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-11T00:48:02.285438" elapsed="0.001025"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:02.284959" elapsed="0.001582"/>
</kw>
<msg time="2026-04-11T00:48:02.286587" 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-11T00:48:02.276878" elapsed="0.009753"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:02.276411" elapsed="0.010293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:02.287154" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:02.286897" elapsed="0.000301"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:02.292230" 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-11T00:48:02.291816" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:02.292719" 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-11T00:48:02.292433" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:02.292792" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:48:02.292955" 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-11T00:48:02.291441" elapsed="0.001539"/>
</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-11T00:48:02.293130" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:02.293790" level="INFO">${ds_type} = operational</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-11T00:48:02.293457" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:02.294207" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:02.293971" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:02.294636" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:02.294399" 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-11T00:48:02.295052" 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-11T00:48:02.295304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:02.295158" 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-11T00:48:02.295547" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:02.295399" elapsed="0.000203"/>
</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-11T00:48:02.295770" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:02.295626" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:02.295140" elapsed="0.000705"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:02.294888" elapsed="0.000994"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:02.294708" elapsed="0.001255"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:02.296005" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:48:02.296213" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:02.296258" 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-11T00:48:02.290723" elapsed="0.005558"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:02.296736" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:02.296811" 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-11T00:48:02.296469" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:02.297594" 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-11T00:48:02.297282" elapsed="0.000384">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:02.296902" elapsed="0.000832">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:02.296885" elapsed="0.000881">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-11T00:48:02.297918" 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-11T00:48:02.298091" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:02.298157" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:02.288223" elapsed="0.010039">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:02.287993" elapsed="0.010338">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:02.287836" elapsed="0.010564">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:02.287442" elapsed="0.011051">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:02.298723" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:02.261631" elapsed="0.037207">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:03.323227" elapsed="0.000252"/>
</kw>
<msg time="2026-04-11T00:48:03.323547" 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-11T00:48:03.322590" elapsed="0.001021"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:03.322125" elapsed="0.001564"/>
</kw>
<msg time="2026-04-11T00:48:03.323735" 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-11T00:48:03.314137" elapsed="0.009641"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:03.313732" elapsed="0.010120"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:03.324298" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:03.324044" elapsed="0.000300"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:03.329519" 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-11T00:48:03.329121" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:03.329986" 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-11T00:48:03.329705" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:03.330133" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:03.330293" 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-11T00:48:03.328750" elapsed="0.001568"/>
</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-11T00:48:03.330485" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:03.331128" level="INFO">${ds_type} = operational</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-11T00:48:03.330798" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:03.331564" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:03.331311" elapsed="0.000279"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:03.331969" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:03.331736" elapsed="0.000259"/>
</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-11T00:48:03.332404" elapsed="0.000027"/>
</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-11T00:48:03.332675" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:03.332527" 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-11T00:48:03.332893" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:03.332755" elapsed="0.000192"/>
</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-11T00:48:03.333114" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:03.332970" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:03.332499" elapsed="0.000690"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:03.332224" elapsed="0.000989"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:03.332040" elapsed="0.001197"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:03.333276" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:48:03.333488" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:03.333534" 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-11T00:48:03.328008" elapsed="0.005549"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:03.333998" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:03.334073" 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-11T00:48:03.333725" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:03.334672" 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-11T00:48:03.334375" elapsed="0.000369">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:03.334163" elapsed="0.000647">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:03.334146" 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-11T00:48:03.334991" 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-11T00:48:03.335167" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:03.335232" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:03.325356" elapsed="0.009981">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:03.325123" elapsed="0.010300">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:03.324986" elapsed="0.010493">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:03.324598" elapsed="0.010969">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:03.335795" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:03.299747" elapsed="0.036195">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:04.359896" elapsed="0.000228"/>
</kw>
<msg time="2026-04-11T00:48:04.360190" 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-11T00:48:04.359235" elapsed="0.001016"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:04.358782" elapsed="0.001547"/>
</kw>
<msg time="2026-04-11T00:48:04.360375" 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-11T00:48:04.350772" elapsed="0.009663"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:04.350349" elapsed="0.010161"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:04.360961" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:04.360702" elapsed="0.000304"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:04.366060" 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-11T00:48:04.365674" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:04.366546" 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-11T00:48:04.366246" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:04.366620" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:48:04.366775" 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-11T00:48:04.365271" elapsed="0.001528"/>
</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-11T00:48:04.366957" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:04.367610" level="INFO">${ds_type} = operational</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-11T00:48:04.367266" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:04.368022" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:04.367790" elapsed="0.000258"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:04.368435" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:04.368190" elapsed="0.000271"/>
</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-11T00:48:04.368847" 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-11T00:48:04.369094" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:04.368950" elapsed="0.000223"/>
</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-11T00:48:04.369340" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:04.369200" elapsed="0.000208"/>
</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-11T00:48:04.369577" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:04.369432" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:04.368932" elapsed="0.000719"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:04.368684" elapsed="0.000990"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:04.368506" elapsed="0.001193"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:04.369737" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:04.369933" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:04.369978" 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-11T00:48:04.364536" elapsed="0.005465"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:04.370525" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:04.370602" 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-11T00:48:04.370238" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:04.372762" 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-11T00:48:04.372476" elapsed="0.000356">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:04.372234" elapsed="0.000664">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:04.370677" elapsed="0.002253">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-11T00:48:04.373084" 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-11T00:48:04.373271" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:04.373339" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:04.362038" elapsed="0.011427">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:04.361814" elapsed="0.011722">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:04.361675" elapsed="0.011916">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:04.361257" elapsed="0.012424">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:04.373911" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:04.336890" elapsed="0.037135">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:05.399207" elapsed="0.000273"/>
</kw>
<msg time="2026-04-11T00:48:05.399551" 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-11T00:48:05.398559" elapsed="0.001062"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:05.398078" elapsed="0.001623"/>
</kw>
<msg time="2026-04-11T00:48:05.399746" 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-11T00:48:05.389864" elapsed="0.009927"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:05.389402" elapsed="0.010461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:05.400313" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:05.400058" elapsed="0.000299"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:05.405572" 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-11T00:48:05.405172" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:05.406074" 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-11T00:48:05.405760" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:05.406149" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:48:05.406310" 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-11T00:48:05.404802" elapsed="0.001532"/>
</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-11T00:48:05.406508" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:05.407150" level="INFO">${ds_type} = operational</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-11T00:48:05.406820" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:05.407673" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:05.407430" elapsed="0.000270"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:05.408084" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:05.407847" 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-11T00:48:05.408514" 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-11T00:48:05.408770" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:05.408624" 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-11T00:48:05.408992" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:05.408851" 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-11T00:48:05.409211" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:05.409070" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:05.408604" elapsed="0.000681"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:05.408334" elapsed="0.000975"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:05.408156" elapsed="0.001179"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:05.409376" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:48:05.409590" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:05.409636" 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-11T00:48:05.404080" elapsed="0.005579"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:05.410149" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:05.410231" 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-11T00:48:05.409852" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:05.410838" 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-11T00:48:05.410558" elapsed="0.000352">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:05.410324" elapsed="0.000653">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:05.410306" elapsed="0.000703">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-11T00:48:05.411159" 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-11T00:48:05.411329" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:05.411411" elapsed="0.000016"/>
</return>
<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>
<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-11T00:48:05.401395" elapsed="0.010123">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:05.401147" elapsed="0.010439">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:05.400995" elapsed="0.010646">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:05.400602" elapsed="0.011127">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:05.411960" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:05.375019" elapsed="0.037056">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:06.438116" elapsed="0.000243"/>
</kw>
<msg time="2026-04-11T00:48:06.438481" 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-11T00:48:06.437230" elapsed="0.001319"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:06.436766" elapsed="0.001941"/>
</kw>
<msg time="2026-04-11T00:48:06.438753" 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-11T00:48:06.428276" elapsed="0.010521"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:06.427841" elapsed="0.011029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:06.439325" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:06.439064" elapsed="0.000307"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:06.444411" 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-11T00:48:06.444007" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:06.444884" 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-11T00:48:06.444598" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:06.444958" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:48:06.445120" 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-11T00:48:06.443639" elapsed="0.001506"/>
</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-11T00:48:06.445294" elapsed="0.000186"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:06.445974" level="INFO">${ds_type} = operational</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-11T00:48:06.445641" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:06.446409" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:06.446156" elapsed="0.000310"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:06.446850" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:06.446614" 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-11T00:48:06.447268" 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-11T00:48:06.447546" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:06.447374" elapsed="0.000228"/>
</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-11T00:48:06.447765" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:06.447627" elapsed="0.000190"/>
</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-11T00:48:06.447976" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:06.447839" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:06.447356" elapsed="0.000692"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:06.447104" elapsed="0.000968"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:06.446922" elapsed="0.001176"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:06.448139" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:06.448336" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:06.448381" 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-11T00:48:06.442922" elapsed="0.005503"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:06.448900" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:06.448977" 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-11T00:48:06.448626" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:06.449773" 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-11T00:48:06.449279" elapsed="0.000567">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:06.449067" elapsed="0.000887">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:06.449050" elapsed="0.000938">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-11T00:48:06.450140" elapsed="0.000023"/>
</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-11T00:48:06.450315" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:06.450381" elapsed="0.000032"/>
</return>
<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>
<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-11T00:48:06.440417" elapsed="0.010107">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:06.440160" elapsed="0.010435">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:06.440014" elapsed="0.010636">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:06.439619" elapsed="0.011119">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:06.450968" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:06.413081" elapsed="0.038002">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:07.478409" elapsed="0.000262"/>
</kw>
<msg time="2026-04-11T00:48:07.478747" 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-11T00:48:07.477747" elapsed="0.001069"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:07.477242" elapsed="0.001656"/>
</kw>
<msg time="2026-04-11T00:48:07.478949" 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-11T00:48:07.468046" elapsed="0.010953"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:07.467469" elapsed="0.011637"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:07.479604" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:07.479302" elapsed="0.000350"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:07.485238" 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-11T00:48:07.484843" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:07.485755" 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-11T00:48:07.485457" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:07.485832" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:48:07.485995" 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-11T00:48:07.484416" elapsed="0.001610"/>
</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-11T00:48:07.486194" elapsed="0.000160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:07.486889" level="INFO">${ds_type} = operational</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-11T00:48:07.486531" elapsed="0.000391"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:07.487669" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:07.487110" elapsed="0.000593"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:07.488214" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:07.487900" elapsed="0.000342"/>
</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-11T00:48:07.488740" elapsed="0.000026"/>
</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-11T00:48:07.489050" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:07.488855" elapsed="0.000268"/>
</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-11T00:48:07.489346" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:07.489156" elapsed="0.000285"/>
</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-11T00:48:07.489675" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:07.489475" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:07.488834" elapsed="0.000950"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:07.488498" elapsed="0.001320"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:07.488292" elapsed="0.001562"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:07.489913" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:48:07.490179" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:07.490230" 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-11T00:48:07.483541" elapsed="0.006713"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:07.490776" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:07.490886" 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-11T00:48:07.490448" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:07.491626" 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-11T00:48:07.491303" elapsed="0.000402">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:07.491013" elapsed="0.000761">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:07.490988" elapsed="0.000818">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-11T00:48:07.491960" elapsed="0.000026"/>
</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-11T00:48:07.492185" elapsed="0.000027"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:07.492267" elapsed="0.000020"/>
</return>
<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>
<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-11T00:48:07.480694" elapsed="0.011729">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:07.480457" elapsed="0.012060">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:07.480294" elapsed="0.012303">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:07.479897" elapsed="0.012826">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:07.492995" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:07.452061" elapsed="0.041055">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:08.518939" elapsed="0.000246"/>
</kw>
<msg time="2026-04-11T00:48:08.519258" 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-11T00:48:08.518275" elapsed="0.001051"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:08.517815" elapsed="0.001606"/>
</kw>
<msg time="2026-04-11T00:48:08.519469" 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-11T00:48:08.509694" elapsed="0.009820"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:08.509245" elapsed="0.010475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:08.520179" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:08.519919" elapsed="0.000305"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:08.525501" 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-11T00:48:08.525099" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:08.525974" 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-11T00:48:08.525688" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:08.526048" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:48:08.526208" 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-11T00:48:08.524734" elapsed="0.001499"/>
</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-11T00:48:08.526398" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:08.527055" level="INFO">${ds_type} = operational</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-11T00:48:08.526722" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:08.527490" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:08.527237" elapsed="0.000279"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:08.527912" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:08.527661" elapsed="0.000276"/>
</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-11T00:48:08.528325" 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-11T00:48:08.528598" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:08.528451" 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-11T00:48:08.528813" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:08.528676" elapsed="0.000189"/>
</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-11T00:48:08.529025" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:08.528888" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:08.528431" elapsed="0.000666"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:08.528161" elapsed="0.000959"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:08.527982" elapsed="0.001163"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:08.529184" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:08.529395" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:08.529444" 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-11T00:48:08.524010" elapsed="0.005457"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:08.529904" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:08.529980" 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-11T00:48:08.529639" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:08.530582" 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-11T00:48:08.530283" elapsed="0.000373">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:08.530070" elapsed="0.000651">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:08.530053" elapsed="0.000700">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-11T00:48:08.530902" 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-11T00:48:08.531072" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:08.531174" elapsed="0.000017"/>
</return>
<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>
<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-11T00:48:08.521259" elapsed="0.010023">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:08.521022" elapsed="0.010329">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:08.520877" elapsed="0.010546">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:08.520468" elapsed="0.011045">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:08.531774" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:08.494080" elapsed="0.037811">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:09.556739" elapsed="0.000296"/>
</kw>
<msg time="2026-04-11T00:48:09.557104" 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-11T00:48:09.556053" elapsed="0.001115"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:09.555553" elapsed="0.001692"/>
</kw>
<msg time="2026-04-11T00:48:09.557291" 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-11T00:48:09.547059" elapsed="0.010275"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:09.546638" elapsed="0.010786"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:09.557915" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:09.557622" elapsed="0.000349"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:09.563053" 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-11T00:48:09.562672" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:09.563536" 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-11T00:48:09.563237" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:09.563608" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:09.563770" 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-11T00:48:09.562292" elapsed="0.001502"/>
</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-11T00:48:09.563943" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:09.564614" level="INFO">${ds_type} = operational</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-11T00:48:09.564256" elapsed="0.000384"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:09.565028" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:09.564794" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:09.565494" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:09.565208" elapsed="0.000316"/>
</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-11T00:48:09.565974" elapsed="0.000027"/>
</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-11T00:48:09.566262" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:09.566097" elapsed="0.000313"/>
</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-11T00:48:09.566589" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:09.566442" elapsed="0.000203"/>
</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-11T00:48:09.566810" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:09.566669" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:09.566075" elapsed="0.000809"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:09.565785" elapsed="0.001123"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:09.565579" elapsed="0.001377"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:09.566997" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:09.567229" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:09.567277" 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-11T00:48:09.561595" elapsed="0.005705"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:09.567762" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:09.567840" 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-11T00:48:09.567491" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:09.568680" 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-11T00:48:09.568367" elapsed="0.000385">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:09.567932" elapsed="0.000889">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:09.567914" elapsed="0.000938">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-11T00:48:09.569003" 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-11T00:48:09.569176" elapsed="0.000026"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:09.569260" elapsed="0.000021"/>
</return>
<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>
<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-11T00:48:09.559075" elapsed="0.010333">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:09.558839" elapsed="0.010650">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:09.558682" elapsed="0.010881">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:09.558219" elapsed="0.011470">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:09.569935" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:09.532801" elapsed="0.037248">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:10.595217" elapsed="0.000250"/>
</kw>
<msg time="2026-04-11T00:48:10.595529" 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-11T00:48:10.594574" elapsed="0.001020"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:10.594101" elapsed="0.001572"/>
</kw>
<msg time="2026-04-11T00:48:10.595718" 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-11T00:48:10.586006" elapsed="0.009757"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:10.585559" elapsed="0.010277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:10.596280" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:10.596023" elapsed="0.000303"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:10.601612" 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-11T00:48:10.601211" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:10.602223" 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-11T00:48:10.601867" elapsed="0.000384"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:10.602299" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:48:10.602476" 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-11T00:48:10.600833" elapsed="0.001667"/>
</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-11T00:48:10.602651" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:10.603289" level="INFO">${ds_type} = operational</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-11T00:48:10.602960" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:10.603729" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:10.603493" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:10.604133" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:10.603898" 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-11T00:48:10.604566" 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-11T00:48:10.604817" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:10.604671" 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-11T00:48:10.605063" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:10.604911" elapsed="0.000207"/>
</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-11T00:48:10.605279" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:10.605141" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:10.604653" elapsed="0.000698"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:10.604399" elapsed="0.000975"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:10.604205" elapsed="0.001212"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:10.605456" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:48:10.605653" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:10.605704" 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-11T00:48:10.600114" elapsed="0.005613"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:10.606165" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:10.606240" 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-11T00:48:10.605897" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:10.606839" 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-11T00:48:10.606562" elapsed="0.000348">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:10.606330" elapsed="0.000646">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:10.606313" elapsed="0.000694">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-11T00:48:10.607156" 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-11T00:48:10.607343" elapsed="0.000023"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:10.607431" elapsed="0.000017"/>
</return>
<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>
<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-11T00:48:10.597480" elapsed="0.010059">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:10.597235" elapsed="0.010411">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:10.597094" elapsed="0.010610">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:10.596664" elapsed="0.011130">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:10.608027" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:10.570943" elapsed="0.037200">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:11.632631" elapsed="0.000241"/>
</kw>
<msg time="2026-04-11T00:48:11.632937" 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-11T00:48:11.631976" elapsed="0.001023"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:11.631520" elapsed="0.001557"/>
</kw>
<msg time="2026-04-11T00:48:11.633123" 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-11T00:48:11.623518" elapsed="0.009649"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:11.623096" elapsed="0.010145"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:11.633728" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:11.633443" elapsed="0.000330"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:11.638747" 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-11T00:48:11.638348" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:11.639214" 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-11T00:48:11.638932" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:11.639287" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:48:11.639459" 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-11T00:48:11.637974" elapsed="0.001509"/>
</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-11T00:48:11.639633" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:11.640273" level="INFO">${ds_type} = operational</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-11T00:48:11.639947" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:11.640703" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:11.640468" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:11.641101" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:11.640871" 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-11T00:48:11.641564" elapsed="0.000033"/>
</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-11T00:48:11.641828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:11.641680" 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-11T00:48:11.642046" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:11.641908" elapsed="0.000190"/>
</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-11T00:48:11.642264" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:11.642125" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:11.641661" elapsed="0.000755"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:11.641349" elapsed="0.001093"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:11.641172" elapsed="0.001295"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:11.642507" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:11.642707" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:11.642751" 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-11T00:48:11.637235" elapsed="0.005539"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:11.643213" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:11.643288" 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-11T00:48:11.642946" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:11.644054" 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-11T00:48:11.643773" elapsed="0.000352">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:11.643378" elapsed="0.000813">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:11.643361" elapsed="0.000862">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-11T00:48:11.644372" elapsed="0.000037"/>
</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-11T00:48:11.644561" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:11.644626" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:11.634768" elapsed="0.009962">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:11.634540" elapsed="0.010259">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:11.634399" elapsed="0.010453">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:11.633995" elapsed="0.010943">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:11.645166" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:11.608989" elapsed="0.036291">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:12.672346" elapsed="0.000252"/>
</kw>
<msg time="2026-04-11T00:48:12.672663" 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-11T00:48:12.671709" elapsed="0.001018"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:12.671239" elapsed="0.001566"/>
</kw>
<msg time="2026-04-11T00:48:12.672850" 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-11T00:48:12.663214" elapsed="0.009685"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:12.662803" elapsed="0.010170"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:12.673438" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:12.673163" elapsed="0.000320"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:12.678608" 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-11T00:48:12.678213" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:12.679148" 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-11T00:48:12.678860" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:12.679222" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:48:12.679377" 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-11T00:48:12.677824" elapsed="0.001593"/>
</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-11T00:48:12.679566" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:12.680201" level="INFO">${ds_type} = operational</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-11T00:48:12.679873" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:12.680633" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:12.680395" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:12.681033" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:12.680801" 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-11T00:48:12.681462" 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-11T00:48:12.681716" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:12.681570" 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-11T00:48:12.681940" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:12.681796" elapsed="0.000197"/>
</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-11T00:48:12.682186" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:12.682017" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:12.681551" elapsed="0.000713"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:12.681282" elapsed="0.001005"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:12.681104" elapsed="0.001209"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:12.682351" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:12.682566" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:12.682613" 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-11T00:48:12.677111" elapsed="0.005525"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:12.683069" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:12.683145" 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-11T00:48:12.682803" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:12.683741" 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-11T00:48:12.683463" elapsed="0.000347">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:12.683236" elapsed="0.000638">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:12.683218" elapsed="0.000688">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-11T00:48:12.684055" 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-11T00:48:12.684226" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:12.684290" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:12.674503" elapsed="0.009905">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:12.674258" elapsed="0.010221">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:12.674117" elapsed="0.010416">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:12.673706" elapsed="0.010914">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:12.684848" elapsed="0.000055"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:12.646188" elapsed="0.038808">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:13.713367" elapsed="0.000259"/>
</kw>
<msg time="2026-04-11T00:48:13.713698" 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-11T00:48:13.712725" elapsed="0.001039"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:13.712249" elapsed="0.001593"/>
</kw>
<msg time="2026-04-11T00:48:13.713886" 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-11T00:48:13.704178" elapsed="0.009750"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:13.703761" elapsed="0.010238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:13.714458" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:13.714188" elapsed="0.000316"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:13.719484" 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-11T00:48:13.719081" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:13.719952" 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-11T00:48:13.719669" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:13.720026" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:48:13.720187" 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-11T00:48:13.718719" elapsed="0.001492"/>
</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-11T00:48:13.720359" elapsed="0.000172"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:13.721013" level="INFO">${ds_type} = operational</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-11T00:48:13.720686" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:13.721441" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:13.721191" elapsed="0.000276"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:13.721842" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:13.721611" elapsed="0.000256"/>
</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-11T00:48:13.722260" 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-11T00:48:13.722532" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:13.722367" elapsed="0.000220"/>
</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-11T00:48:13.722778" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:13.722612" elapsed="0.000220"/>
</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-11T00:48:13.722993" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:13.722855" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:13.722348" elapsed="0.000717"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:13.722097" elapsed="0.000992"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:13.721914" elapsed="0.001202"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:13.723155" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:13.723350" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:13.723411" 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-11T00:48:13.717988" elapsed="0.005447"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:13.723967" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:13.724060" 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-11T00:48:13.723695" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:13.762040" 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-11T00:48:13.724367" elapsed="0.037777">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:13.724152" elapsed="0.038101">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:13.724135" elapsed="0.038161">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-11T00:48:13.762528" elapsed="0.000032"/>
</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-11T00:48:13.762734" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:13.762806" elapsed="0.000019"/>
</return>
<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>
<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-11T00:48:13.715527" elapsed="0.047400">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:13.715284" elapsed="0.047714">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:13.715142" elapsed="0.047915">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:13.714750" elapsed="0.048399">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:13.763425" elapsed="0.000028"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:13.685970" elapsed="0.077576">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:14.788999" elapsed="0.000252"/>
</kw>
<msg time="2026-04-11T00:48:14.789323" 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-11T00:48:14.788322" elapsed="0.001086"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:14.787864" elapsed="0.001628"/>
</kw>
<msg time="2026-04-11T00:48:14.789539" 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-11T00:48:14.779821" elapsed="0.009763"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:14.779397" elapsed="0.010261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:14.790113" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:14.789857" elapsed="0.000301"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:14.795402" 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-11T00:48:14.794987" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:14.795898" 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-11T00:48:14.795594" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:14.795975" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:48:14.796137" 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-11T00:48:14.794613" elapsed="0.001549"/>
</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-11T00:48:14.796415" elapsed="0.000160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:14.797071" level="INFO">${ds_type} = operational</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-11T00:48:14.796736" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:14.797511" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:14.797254" elapsed="0.000283"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:14.797921" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:14.797684" 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-11T00:48:14.798346" 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-11T00:48:14.798628" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:14.798477" elapsed="0.000207"/>
</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-11T00:48:14.798847" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:14.798709" elapsed="0.000192"/>
</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-11T00:48:14.799066" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:14.798924" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:14.798456" elapsed="0.000683"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:14.798178" elapsed="0.000988"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:14.797994" elapsed="0.001201"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:14.799236" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:14.799480" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:14.799528" 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-11T00:48:14.793890" elapsed="0.005661"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:14.799993" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:14.800069" 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-11T00:48:14.799721" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:14.800676" 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-11T00:48:14.800374" elapsed="0.000377">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:14.800161" elapsed="0.000660">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:14.800143" elapsed="0.000709">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-11T00:48:14.801002" 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-11T00:48:14.801173" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:14.801237" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:14.791190" elapsed="0.010151">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:14.790950" elapsed="0.010478">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:14.790799" elapsed="0.010686">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:14.790398" elapsed="0.011176">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:14.801803" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:14.764495" elapsed="0.037422">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:15.826824" elapsed="0.000239"/>
</kw>
<msg time="2026-04-11T00:48:15.827132" 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-11T00:48:15.826088" elapsed="0.001109"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:15.825631" elapsed="0.001646"/>
</kw>
<msg time="2026-04-11T00:48:15.827323" 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-11T00:48:15.817583" elapsed="0.009782"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:15.817152" elapsed="0.010304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:15.827925" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:15.827647" elapsed="0.000323"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:15.832920" 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-11T00:48:15.832539" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:15.833401" 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-11T00:48:15.833103" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:15.833477" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:48:15.833634" 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-11T00:48:15.832159" elapsed="0.001498"/>
</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-11T00:48:15.833805" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:15.834458" level="INFO">${ds_type} = operational</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-11T00:48:15.834113" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:15.834878" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:15.834640" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:15.835279" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:15.835048" elapsed="0.000256"/>
</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-11T00:48:15.835710" 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-11T00:48:15.835989" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:15.835817" elapsed="0.000230"/>
</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-11T00:48:15.836210" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:15.836072" elapsed="0.000192"/>
</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-11T00:48:15.836447" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:15.836287" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:15.835798" elapsed="0.000723"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:15.835547" elapsed="0.000999"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:15.835351" elapsed="0.001221"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:15.836611" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:15.836815" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:15.836860" 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-11T00:48:15.831443" elapsed="0.005440"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:15.837511" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:15.837588" 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-11T00:48:15.837050" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:15.838219" 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-11T00:48:15.837940" elapsed="0.000351">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:15.837724" elapsed="0.000635">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:15.837706" elapsed="0.000709">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-11T00:48:15.838565" 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-11T00:48:15.838734" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:15.838799" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:15.828983" elapsed="0.009929">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:15.828754" elapsed="0.010225">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:15.828607" elapsed="0.010426">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:15.828199" elapsed="0.010920">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:15.839346" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:15.802862" elapsed="0.036615">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:16.863652" elapsed="0.000234"/>
</kw>
<msg time="2026-04-11T00:48:16.863950" 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-11T00:48:16.862996" elapsed="0.001017"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:16.862537" elapsed="0.001555"/>
</kw>
<msg time="2026-04-11T00:48:16.864138" 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-11T00:48:16.854425" elapsed="0.009758"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:16.853990" elapsed="0.010266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:16.864741" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:16.864482" elapsed="0.000304"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:16.869957" 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-11T00:48:16.869572" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:16.870452" 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-11T00:48:16.870143" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:16.870524" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:16.870679" 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-11T00:48:16.869176" elapsed="0.001527"/>
</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-11T00:48:16.870852" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:16.871506" level="INFO">${ds_type} = operational</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-11T00:48:16.871159" elapsed="0.000373"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:16.871920" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:16.871686" elapsed="0.000325"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:16.872419" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:16.872163" elapsed="0.000283"/>
</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-11T00:48:16.872868" 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-11T00:48:16.873121" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:16.872974" 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-11T00:48:16.873342" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:16.873203" elapsed="0.000217"/>
</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-11T00:48:16.873587" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:16.873445" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:16.872955" elapsed="0.000707"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:16.872702" elapsed="0.000983"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:16.872516" elapsed="0.001195"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:16.873751" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:16.873949" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:16.873995" 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-11T00:48:16.868466" elapsed="0.005552"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:16.874471" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:16.874548" 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-11T00:48:16.874188" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:16.875132" 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-11T00:48:16.874855" elapsed="0.000348">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:16.874641" elapsed="0.000629">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:16.874623" elapsed="0.000679">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-11T00:48:16.875481" 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-11T00:48:16.875656" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:16.875720" elapsed="0.000016"/>
</return>
<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>
<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-11T00:48:16.865783" elapsed="0.010044">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:16.865556" elapsed="0.010341">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:16.865415" elapsed="0.010537">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:16.865009" elapsed="0.011032">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:16.876317" elapsed="0.000030"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:16.840371" elapsed="0.036113">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:17.901590" elapsed="0.000242"/>
</kw>
<msg time="2026-04-11T00:48:17.901900" 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-11T00:48:17.900905" elapsed="0.001060"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:17.900416" elapsed="0.001626"/>
</kw>
<msg time="2026-04-11T00:48:17.902152" 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-11T00:48:17.891932" elapsed="0.010266"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:17.891304" elapsed="0.010969"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:17.902736" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:17.902477" elapsed="0.000304"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:17.907732" 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-11T00:48:17.907311" elapsed="0.000462"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:17.908256" 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-11T00:48:17.907946" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:17.908332" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:48:17.908512" 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-11T00:48:17.906943" elapsed="0.001594"/>
</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-11T00:48:17.908691" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:17.909459" level="INFO">${ds_type} = operational</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-11T00:48:17.909009" elapsed="0.000480"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:17.909901" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:17.909654" elapsed="0.000274"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:17.910316" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:17.910076" elapsed="0.000266"/>
</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-11T00:48:17.910753" 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-11T00:48:17.911009" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:17.910861" 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-11T00:48:17.911233" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:17.911091" 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-11T00:48:17.911465" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:17.911309" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:17.910842" elapsed="0.000701"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:17.910587" elapsed="0.000979"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:17.910403" elapsed="0.001188"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:17.911630" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:48:17.911833" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:17.911879" 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-11T00:48:17.906222" elapsed="0.005681"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:17.912541" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:17.912620" 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-11T00:48:17.912073" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:17.913252" 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-11T00:48:17.912935" elapsed="0.000393">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:17.912716" elapsed="0.000695">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:17.912698" elapsed="0.000785">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-11T00:48:17.913642" elapsed="0.000023"/>
</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-11T00:48:17.913816" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:17.913883" elapsed="0.000016"/>
</return>
<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>
<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-11T00:48:17.903763" elapsed="0.010230">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:17.903540" elapsed="0.010522">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:17.903400" elapsed="0.010716">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:17.903001" elapsed="0.011206">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:17.914451" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:17.877423" elapsed="0.037146">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:18.937901" elapsed="0.000250"/>
</kw>
<msg time="2026-04-11T00:48:18.938219" 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-11T00:48:18.937229" elapsed="0.001056"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:18.936771" elapsed="0.001593"/>
</kw>
<msg time="2026-04-11T00:48:18.938425" 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-11T00:48:18.928709" elapsed="0.009761"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:18.928284" elapsed="0.010259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:18.938999" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:18.938737" elapsed="0.000307"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:18.944186" 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-11T00:48:18.943806" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:18.944679" 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-11T00:48:18.944370" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:18.944753" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:48:18.944914" 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-11T00:48:18.943441" elapsed="0.001497"/>
</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-11T00:48:18.945086" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:18.945756" level="INFO">${ds_type} = operational</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-11T00:48:18.945410" elapsed="0.000373"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:18.946173" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:18.945938" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:18.946596" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:18.946342" elapsed="0.000280"/>
</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-11T00:48:18.947010" 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-11T00:48:18.947337" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:18.947188" 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-11T00:48:18.947575" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:18.947434" 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-11T00:48:18.947790" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:18.947651" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:18.947168" elapsed="0.000695"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:18.946847" elapsed="0.001041"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:18.946668" elapsed="0.001246"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:18.947953" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:18.948152" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:18.948196" 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-11T00:48:18.942725" elapsed="0.005494"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:18.948671" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:18.948747" 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-11T00:48:18.948401" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:18.949330" 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-11T00:48:18.949050" elapsed="0.000372">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:18.948838" elapsed="0.000654">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:18.948820" elapsed="0.000704">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-11T00:48:18.949704" elapsed="0.000027"/>
</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-11T00:48:18.949881" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:18.949946" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:18.940043" elapsed="0.010008">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:18.939813" elapsed="0.010306">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:18.939673" elapsed="0.010499">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:18.939270" elapsed="0.010988">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:18.950502" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:18.915479" elapsed="0.035136">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:19.976567" elapsed="0.000239"/>
</kw>
<msg time="2026-04-11T00:48:19.976873" 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-11T00:48:19.975913" elapsed="0.001024"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:19.975457" elapsed="0.001557"/>
</kw>
<msg time="2026-04-11T00:48:19.977059" 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-11T00:48:19.967420" elapsed="0.009682"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:19.966997" elapsed="0.010177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:19.977717" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:19.977458" elapsed="0.000304"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:19.982767" 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-11T00:48:19.982367" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:19.983244" 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-11T00:48:19.982960" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:19.983316" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:48:19.983489" 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-11T00:48:19.981973" elapsed="0.001541"/>
</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-11T00:48:19.983665" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:19.984308" level="INFO">${ds_type} = operational</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-11T00:48:19.983977" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:19.984742" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:19.984507" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:19.985287" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:19.984912" elapsed="0.000401"/>
</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-11T00:48:19.985722" 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-11T00:48:19.985975" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:19.985828" 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-11T00:48:19.986204" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:19.986055" elapsed="0.000203"/>
</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-11T00:48:19.986435" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:19.986281" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:19.985809" elapsed="0.000700"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:19.985559" elapsed="0.000974"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:19.985358" elapsed="0.001200"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:19.986595" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:19.986790" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:19.986835" 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-11T00:48:19.981254" elapsed="0.005604"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:19.987468" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:19.987546" 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-11T00:48:19.987025" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:19.988133" 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-11T00:48:19.987853" elapsed="0.000351">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:19.987637" elapsed="0.000633">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:19.987619" elapsed="0.000684">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-11T00:48:19.988470" elapsed="0.000023"/>
</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-11T00:48:19.988645" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:19.988711" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:19.978807" elapsed="0.010045">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:19.978581" elapsed="0.010342">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:19.978440" elapsed="0.010538">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:19.977987" elapsed="0.011080">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:19.989298" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:19.951583" elapsed="0.037845">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:21.017551" elapsed="0.000265"/>
</kw>
<msg time="2026-04-11T00:48:21.017887" 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-11T00:48:21.016884" elapsed="0.001071"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:21.016419" elapsed="0.001617"/>
</kw>
<msg time="2026-04-11T00:48:21.018083" 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-11T00:48:21.008202" elapsed="0.009926"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:21.007731" elapsed="0.010474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:21.018682" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:21.018416" elapsed="0.000313"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:21.024065" 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-11T00:48:21.023679" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:21.024561" 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-11T00:48:21.024250" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:21.024636" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:21.024826" 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-11T00:48:21.023290" elapsed="0.001562"/>
</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-11T00:48:21.025009" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:21.025674" level="INFO">${ds_type} = operational</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-11T00:48:21.025323" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:21.026097" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:21.025861" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:21.026518" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:21.026266" 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-11T00:48:21.026954" 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-11T00:48:21.027211" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:21.027062" 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-11T00:48:21.027447" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:21.027292" elapsed="0.000280"/>
</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-11T00:48:21.027744" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:21.027598" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:21.027043" elapsed="0.000793"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:21.026785" elapsed="0.001082"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:21.026588" elapsed="0.001311"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:21.027947" elapsed="0.000035"/>
</return>
<msg time="2026-04-11T00:48:21.028156" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:21.028201" 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-11T00:48:21.022546" elapsed="0.005678"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:21.028688" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:21.028765" 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-11T00:48:21.028413" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:21.029357" 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-11T00:48:21.029076" elapsed="0.000372">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:21.028859" elapsed="0.000658">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:21.028840" 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-11T00:48:21.029703" 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-11T00:48:21.029876" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:21.029941" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:21.019800" elapsed="0.010245">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:21.019562" elapsed="0.010553">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:21.019416" elapsed="0.010756">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:21.019000" elapsed="0.011264">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:21.030517" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:20.990312" elapsed="0.040323">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:22.054703" elapsed="0.000240"/>
</kw>
<msg time="2026-04-11T00:48:22.055017" 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-11T00:48:22.054037" elapsed="0.001046"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:22.053569" elapsed="0.001596"/>
</kw>
<msg time="2026-04-11T00:48:22.055212" 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-11T00:48:22.045455" elapsed="0.009802"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:22.045023" elapsed="0.010337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:22.055842" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:22.055579" elapsed="0.000308"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:22.061082" 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-11T00:48:22.060688" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:22.061576" 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-11T00:48:22.061272" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:22.061649" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:22.061808" 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-11T00:48:22.060300" elapsed="0.001532"/>
</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-11T00:48:22.061983" elapsed="0.000164"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:22.062657" level="INFO">${ds_type} = operational</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-11T00:48:22.062306" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:22.063073" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:22.062838" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:22.063543" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:22.063252" elapsed="0.000318"/>
</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-11T00:48:22.063960" 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-11T00:48:22.064222" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:22.064068" elapsed="0.000211"/>
</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-11T00:48:22.064461" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:22.064304" elapsed="0.000213"/>
</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-11T00:48:22.064680" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:22.064540" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:22.064049" elapsed="0.000705"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:22.063795" elapsed="0.000984"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:22.063616" elapsed="0.001188"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:22.064843" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:22.065041" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:22.065088" 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-11T00:48:22.059583" elapsed="0.005528"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:22.067050" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:22.067134" 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-11T00:48:22.065290" elapsed="0.001871"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:22.067798" 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-11T00:48:22.067503" elapsed="0.000367">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:22.067247" elapsed="0.000691">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:22.067227" elapsed="0.000745">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-11T00:48:22.068125" 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-11T00:48:22.068307" elapsed="0.000023"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:22.068378" elapsed="0.000032"/>
</return>
<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>
<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-11T00:48:22.056936" elapsed="0.011570">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:22.056704" elapsed="0.011874">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:22.056556" elapsed="0.012078">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:22.056125" elapsed="0.012647">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:22.069010" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:22.031565" elapsed="0.037565">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:23.094530" elapsed="0.000234"/>
</kw>
<msg time="2026-04-11T00:48:23.094840" 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-11T00:48:23.093873" elapsed="0.001038"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:23.093416" elapsed="0.001574"/>
</kw>
<msg time="2026-04-11T00:48:23.095036" 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-11T00:48:23.085357" elapsed="0.009723"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:23.084946" elapsed="0.010207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:23.095615" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:23.095342" elapsed="0.000318"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:23.100856" 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-11T00:48:23.100472" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:23.101324" 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-11T00:48:23.101041" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:23.101412" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:48:23.101573" 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-11T00:48:23.100084" elapsed="0.001513"/>
</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-11T00:48:23.101746" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:23.102398" level="INFO">${ds_type} = operational</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-11T00:48:23.102055" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:23.102817" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:23.102580" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:23.103223" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:23.102986" 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-11T00:48:23.103656" 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-11T00:48:23.103933" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:23.103763" elapsed="0.000226"/>
</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-11T00:48:23.104154" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:23.104014" 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-11T00:48:23.104405" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:23.104231" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:23.103744" elapsed="0.000738"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:23.103491" elapsed="0.001015"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:23.103293" elapsed="0.001300"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:23.104636" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:48:23.104837" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:23.104888" 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-11T00:48:23.099340" elapsed="0.005570"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:23.105348" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:23.105441" 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-11T00:48:23.105080" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:23.106027" 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-11T00:48:23.105747" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:23.105533" elapsed="0.000636">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:23.105515" elapsed="0.000686">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-11T00:48:23.106351" 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-11T00:48:23.106541" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:23.106606" elapsed="0.000016"/>
</return>
<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>
<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-11T00:48:23.096692" elapsed="0.010021">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:23.096456" elapsed="0.010328">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:23.096299" elapsed="0.010540">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:23.095882" elapsed="0.011047">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:23.107160" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:23.070044" elapsed="0.037230">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:24.131850" elapsed="0.000247"/>
</kw>
<msg time="2026-04-11T00:48:24.132167" 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-11T00:48:24.131149" elapsed="0.001087"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:24.130685" elapsed="0.001630"/>
</kw>
<msg time="2026-04-11T00:48:24.132360" 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-11T00:48:24.122427" elapsed="0.009993"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:24.121999" elapsed="0.010528"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:24.132984" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:24.132726" elapsed="0.000302"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:24.137979" 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-11T00:48:24.137595" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:24.138463" 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-11T00:48:24.138164" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:24.138610" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:48:24.138773" 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-11T00:48:24.137211" 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-11T00:48:24.138948" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:24.139608" level="INFO">${ds_type} = operational</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-11T00:48:24.139260" elapsed="0.000375"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:24.140028" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:24.139792" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:24.140451" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:24.140200" elapsed="0.000299"/>
</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-11T00:48:24.140891" 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-11T00:48:24.141145" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:24.140999" 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-11T00:48:24.141364" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:24.141224" elapsed="0.000209"/>
</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-11T00:48:24.141600" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:24.141457" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:24.140980" elapsed="0.000692"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:24.140727" elapsed="0.000969"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:24.140547" elapsed="0.001174"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:24.141761" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:24.141959" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:24.142004" 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-11T00:48:24.136509" elapsed="0.005518"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:24.142479" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:24.142557" 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-11T00:48:24.142196" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:24.143328" 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-11T00:48:24.142861" elapsed="0.000572">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:24.142648" elapsed="0.000858">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:24.142630" elapsed="0.000908">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-11T00:48:24.143690" 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-11T00:48:24.143860" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:24.143926" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:24.134034" elapsed="0.009997">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:24.133805" elapsed="0.010294">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:24.133663" elapsed="0.010491">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:24.133254" elapsed="0.010988">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:24.144503" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:24.108194" elapsed="0.036463">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:25.168368" elapsed="0.000263"/>
</kw>
<msg time="2026-04-11T00:48:25.168700" 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-11T00:48:25.167725" elapsed="0.001040"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:25.167244" elapsed="0.001600"/>
</kw>
<msg time="2026-04-11T00:48:25.168889" 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-11T00:48:25.159162" elapsed="0.009771"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:25.158757" elapsed="0.010249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:25.169497" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:25.169216" elapsed="0.000327"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:25.174571" 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-11T00:48:25.174170" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:25.175044" 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-11T00:48:25.174757" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:25.175118" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:48:25.175277" 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-11T00:48:25.173797" elapsed="0.001505"/>
</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-11T00:48:25.175468" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:25.176110" level="INFO">${ds_type} = operational</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-11T00:48:25.175781" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:25.176746" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:25.176291" elapsed="0.000481"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:25.177172" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:25.176920" 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-11T00:48:25.177607" 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-11T00:48:25.177866" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:25.177717" 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-11T00:48:25.178087" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:25.177948" elapsed="0.000192"/>
</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-11T00:48:25.178302" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:25.178164" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:25.177698" elapsed="0.000679"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:25.177439" elapsed="0.000979"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:25.177243" elapsed="0.001203"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:25.178486" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:25.178683" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:25.178728" 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-11T00:48:25.173070" elapsed="0.005681"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:25.179270" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:25.179350" 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-11T00:48:25.178997" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:25.179965" 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-11T00:48:25.179675" elapsed="0.000363">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:25.179459" elapsed="0.000646">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:25.179441" 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-11T00:48:25.180287" 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-11T00:48:25.180473" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:25.180540" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:25.170556" elapsed="0.010088">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:25.170306" elapsed="0.010406">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:25.170159" elapsed="0.010607">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:25.169768" elapsed="0.011087">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:25.181109" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:25.145622" elapsed="0.035604">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:26.206718" elapsed="0.000234"/>
</kw>
<msg time="2026-04-11T00:48:26.207022" 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-11T00:48:26.206068" elapsed="0.001020"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:26.205597" elapsed="0.001567"/>
</kw>
<msg time="2026-04-11T00:48:26.207209" 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-11T00:48:26.197620" elapsed="0.009632"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:26.197189" elapsed="0.010135"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:26.207790" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:26.207535" elapsed="0.000300"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:26.213061" 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-11T00:48:26.212666" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:26.213553" 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-11T00:48:26.213246" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:26.213645" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:26.213805" 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-11T00:48:26.212280" elapsed="0.001550"/>
</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-11T00:48:26.213983" elapsed="0.000160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:26.214654" level="INFO">${ds_type} = operational</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-11T00:48:26.214302" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:26.215156" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:26.214910" elapsed="0.000272"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:26.215605" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:26.215330" elapsed="0.000301"/>
</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-11T00:48:26.216032" 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-11T00:48:26.216284" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:26.216138" 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-11T00:48:26.216523" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:26.216365" elapsed="0.000213"/>
</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-11T00:48:26.216743" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:26.216602" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:26.216119" elapsed="0.000699"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:26.215863" elapsed="0.000979"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:26.215679" elapsed="0.001188"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:26.216907" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:48:26.217112" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:26.217159" 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-11T00:48:26.211569" elapsed="0.005614"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:26.217680" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:26.217762" 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-11T00:48:26.217367" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:26.218348" 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-11T00:48:26.218070" elapsed="0.000366">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:26.217855" elapsed="0.000648">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:26.217837" elapsed="0.000698">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-11T00:48:26.218686" 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-11T00:48:26.218860" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:26.218927" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:26.208834" elapsed="0.010198">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:26.208603" elapsed="0.010499">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:26.208464" elapsed="0.010694">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:26.208057" elapsed="0.011190">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:26.219509" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:26.182146" elapsed="0.037480">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:27.244749" elapsed="0.000241"/>
</kw>
<msg time="2026-04-11T00:48:27.245057" 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-11T00:48:27.244090" elapsed="0.001031"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:27.243629" elapsed="0.001649"/>
</kw>
<msg time="2026-04-11T00:48:27.245326" 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-11T00:48:27.235572" elapsed="0.009799"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:27.235148" elapsed="0.010315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:27.245912" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:27.245653" elapsed="0.000305"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:27.251035" 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-11T00:48:27.250643" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:27.251520" 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-11T00:48:27.251221" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:27.251593" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:48:27.251750" 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-11T00:48:27.250257" elapsed="0.001518"/>
</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-11T00:48:27.251925" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:27.252580" level="INFO">${ds_type} = operational</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-11T00:48:27.252235" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:27.252997" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:27.252762" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:27.253414" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:27.253166" 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-11T00:48:27.253828" 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-11T00:48:27.254084" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:27.253934" elapsed="0.000233"/>
</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-11T00:48:27.254335" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:27.254194" elapsed="0.000209"/>
</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-11T00:48:27.254566" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:27.254428" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:27.253915" elapsed="0.000724"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:27.253666" elapsed="0.000996"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:27.253486" elapsed="0.001203"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:27.254729" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:27.254926" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:27.254970" 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-11T00:48:27.249528" elapsed="0.005465"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:27.255439" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:27.255516" 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-11T00:48:27.255160" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:27.256321" 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-11T00:48:27.256031" elapsed="0.000378">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:27.255607" elapsed="0.000914">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:27.255590" elapsed="0.000964">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-11T00:48:27.256706" elapsed="0.000023"/>
</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-11T00:48:27.256879" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:27.256946" elapsed="0.000016"/>
</return>
<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>
<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-11T00:48:27.247024" elapsed="0.010028">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:27.246771" elapsed="0.010351">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:27.246629" elapsed="0.010548">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:27.246211" elapsed="0.011055">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:27.257513" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:27.220582" elapsed="0.037047">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:28.281498" elapsed="0.000241"/>
</kw>
<msg time="2026-04-11T00:48:28.281805" 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-11T00:48:28.280839" elapsed="0.001033"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:28.280366" elapsed="0.001585"/>
</kw>
<msg time="2026-04-11T00:48:28.281997" 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-11T00:48:28.272289" elapsed="0.009752"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:28.271874" elapsed="0.010239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:28.282579" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:28.282305" elapsed="0.000319"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:28.287840" 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-11T00:48:28.287445" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:28.288339" 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-11T00:48:28.288038" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:28.288432" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:48:28.288597" 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-11T00:48:28.287050" elapsed="0.001572"/>
</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-11T00:48:28.288777" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:28.289455" level="INFO">${ds_type} = operational</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-11T00:48:28.289095" elapsed="0.000391"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:28.289893" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:28.289648" elapsed="0.000272"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:28.290310" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:28.290067" elapsed="0.000269"/>
</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-11T00:48:28.290857" elapsed="0.000026"/>
</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-11T00:48:28.291123" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:28.290970" elapsed="0.000210"/>
</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-11T00:48:28.291356" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:28.291206" elapsed="0.000225"/>
</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-11T00:48:28.291599" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:28.291456" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:28.290950" elapsed="0.000727"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:28.290592" elapsed="0.001108"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:28.290403" elapsed="0.001324"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:28.291766" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:28.291968" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:28.292014" 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-11T00:48:28.286305" elapsed="0.005733"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:28.292500" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:28.292580" 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-11T00:48:28.292210" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:28.293178" 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-11T00:48:28.292894" elapsed="0.000354">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:28.292676" elapsed="0.000638">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:28.292658" elapsed="0.000688">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-11T00:48:28.293515" elapsed="0.000023"/>
</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-11T00:48:28.293692" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:28.293759" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:28.283668" elapsed="0.010197">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:28.283436" elapsed="0.010500">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:28.283279" elapsed="0.010713">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:28.282885" elapsed="0.011197">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:28.294339" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:28.258526" elapsed="0.035951">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:29.319776" elapsed="0.000238"/>
</kw>
<msg time="2026-04-11T00:48:29.320081" 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-11T00:48:29.319097" elapsed="0.001049"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:29.318630" elapsed="0.001601"/>
</kw>
<msg time="2026-04-11T00:48:29.320276" 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-11T00:48:29.310551" elapsed="0.009770"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:29.310128" elapsed="0.010356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:29.320964" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:29.320675" elapsed="0.000334"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:29.325966" 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-11T00:48:29.325582" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:29.326463" 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-11T00:48:29.326162" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:29.326538" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:48:29.326695" 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-11T00:48:29.325200" elapsed="0.001520"/>
</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-11T00:48:29.326870" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:29.327553" level="INFO">${ds_type} = operational</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-11T00:48:29.327180" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:29.327984" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:29.327743" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:29.328408" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:29.328155" elapsed="0.000280"/>
</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-11T00:48:29.328823" 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-11T00:48:29.329075" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:29.328929" 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-11T00:48:29.329291" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:29.329153" elapsed="0.000191"/>
</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-11T00:48:29.329523" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:29.329366" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:29.328910" elapsed="0.000686"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:29.328660" elapsed="0.000959"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:29.328481" elapsed="0.001164"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:29.329684" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:29.329879" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:29.329924" 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-11T00:48:29.324500" elapsed="0.005446"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:29.330561" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:29.330640" 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-11T00:48:29.330113" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:29.331231" 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-11T00:48:29.330950" elapsed="0.000385">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:29.330733" elapsed="0.000686">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:29.330716" elapsed="0.000737">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-11T00:48:29.331604" 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-11T00:48:29.331774" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:29.331877" elapsed="0.000016"/>
</return>
<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>
<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-11T00:48:29.322019" elapsed="0.009965">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:29.321778" elapsed="0.010276">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:29.321638" elapsed="0.010470">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:29.321232" elapsed="0.010963">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:29.332440" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:29.295611" elapsed="0.036944">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:30.357721" elapsed="0.000240"/>
</kw>
<msg time="2026-04-11T00:48:30.358029" 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-11T00:48:30.357063" elapsed="0.001032"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:30.356607" elapsed="0.001568"/>
</kw>
<msg time="2026-04-11T00:48:30.358221" 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-11T00:48:30.348586" elapsed="0.009679"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:30.348131" elapsed="0.010206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:30.358800" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:30.358546" elapsed="0.000300"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:30.364006" 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-11T00:48:30.363607" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:30.364496" 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-11T00:48:30.364193" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:30.364568" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:48:30.364724" 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-11T00:48:30.363219" elapsed="0.001530"/>
</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-11T00:48:30.364899" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:30.365561" level="INFO">${ds_type} = operational</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-11T00:48:30.365211" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:30.365982" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:30.365744" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:30.366408" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:30.366158" elapsed="0.000276"/>
</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-11T00:48:30.366820" 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-11T00:48:30.367072" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:30.366925" elapsed="0.000272"/>
</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-11T00:48:30.367369" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:30.367225" 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-11T00:48:30.367605" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:30.367463" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:30.366906" elapsed="0.000775"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:30.366657" elapsed="0.001048"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:30.366479" elapsed="0.001251"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:30.367770" elapsed="0.000062"/>
</return>
<msg time="2026-04-11T00:48:30.368009" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:30.368055" 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-11T00:48:30.362516" elapsed="0.005563"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:30.368533" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:30.368610" 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-11T00:48:30.368250" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:30.369197" 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-11T00:48:30.368916" elapsed="0.000364">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:30.368702" elapsed="0.000661">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:30.368684" elapsed="0.000731">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-11T00:48:30.369572" 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-11T00:48:30.369761" elapsed="0.000023"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:30.369830" elapsed="0.000016"/>
</return>
<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>
<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-11T00:48:30.359867" elapsed="0.010069">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:30.359611" elapsed="0.010395">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:30.359472" elapsed="0.010590">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:30.359067" elapsed="0.011085">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:30.370397" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:30.333514" elapsed="0.037000">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:31.398249" elapsed="0.000269"/>
</kw>
<msg time="2026-04-11T00:48:31.398589" 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-11T00:48:31.397574" elapsed="0.001083"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:31.396859" elapsed="0.001881"/>
</kw>
<msg time="2026-04-11T00:48:31.398785" 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-11T00:48:31.387969" elapsed="0.010860"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:31.387281" elapsed="0.011622"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:31.399360" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:31.399101" elapsed="0.000320"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:31.404895" 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-11T00:48:31.404448" elapsed="0.000475"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:31.405377" 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-11T00:48:31.405088" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:31.405472" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:48:31.405638" 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-11T00:48:31.403925" elapsed="0.001738"/>
</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-11T00:48:31.405835" elapsed="0.000166"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:31.406519" level="INFO">${ds_type} = operational</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-11T00:48:31.406162" elapsed="0.000383"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:31.406986" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:31.406702" elapsed="0.000311"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:31.407421" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:31.407167" elapsed="0.000281"/>
</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-11T00:48:31.407852" 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-11T00:48:31.408135" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:31.407975" elapsed="0.000217"/>
</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-11T00:48:31.408407" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:31.408217" elapsed="0.000249"/>
</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-11T00:48:31.408635" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:31.408489" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:31.407949" elapsed="0.000760"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:31.407682" elapsed="0.001051"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:31.407496" elapsed="0.001262"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:31.408798" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:48:31.409000" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:31.409059" 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-11T00:48:31.403044" elapsed="0.006048"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:31.409584" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:31.409662" 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-11T00:48:31.409284" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:31.410542" 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-11T00:48:31.409976" elapsed="0.000653">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:31.409755" elapsed="0.000963">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:31.409737" elapsed="0.001026">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-11T00:48:31.410927" 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-11T00:48:31.411102" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:31.411168" elapsed="0.000017"/>
</return>
<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>
<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-11T00:48:31.400561" elapsed="0.010717">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:31.400286" elapsed="0.011137">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:31.400140" elapsed="0.011344">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:31.399739" elapsed="0.011836">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:31.411852" elapsed="0.000028"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:31.371628" elapsed="0.040347">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:32.436180" elapsed="0.000255"/>
</kw>
<msg time="2026-04-11T00:48:32.436504" 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-11T00:48:32.435534" elapsed="0.001037"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:32.435058" elapsed="0.001592"/>
</kw>
<msg time="2026-04-11T00:48:32.436696" 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-11T00:48:32.427011" elapsed="0.009730"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:32.426589" elapsed="0.010225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:32.437273" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:32.437017" elapsed="0.000301"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:32.442399" 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-11T00:48:32.441997" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:32.442876" 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-11T00:48:32.442588" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:32.442951" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:32.443111" 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-11T00:48:32.441621" elapsed="0.001514"/>
</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-11T00:48:32.443286" elapsed="0.000170"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:32.443948" level="INFO">${ds_type} = operational</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-11T00:48:32.443615" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:32.444587" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:32.444131" elapsed="0.000484"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:32.445024" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:32.444764" elapsed="0.000286"/>
</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-11T00:48:32.445468" 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-11T00:48:32.445726" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:32.445577" 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-11T00:48:32.445947" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:32.445808" elapsed="0.000192"/>
</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-11T00:48:32.446168" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:32.446023" elapsed="0.000441"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:32.445558" elapsed="0.000938"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:32.445281" elapsed="0.001241"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:32.445098" elapsed="0.001451"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:32.446591" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:48:32.446796" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:32.446843" 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-11T00:48:32.440841" elapsed="0.006026"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:32.447314" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:32.447407" 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-11T00:48:32.447040" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:32.448005" 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-11T00:48:32.447721" elapsed="0.000354">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:32.447503" elapsed="0.000638">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:32.447484" elapsed="0.000689">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-11T00:48:32.448326" 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-11T00:48:32.448515" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:32.448583" elapsed="0.000016"/>
</return>
<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>
<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-11T00:48:32.438328" elapsed="0.010363">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:32.438096" elapsed="0.010665">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:32.437952" elapsed="0.010865">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:32.437559" elapsed="0.011372">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:32.449166" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:32.412849" elapsed="0.036434">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:33.473693" elapsed="0.000239"/>
</kw>
<msg time="2026-04-11T00:48:33.473999" 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-11T00:48:33.473031" elapsed="0.001034"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:33.472574" elapsed="0.001569"/>
</kw>
<msg time="2026-04-11T00:48:33.474189" 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-11T00:48:33.464494" elapsed="0.009739"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:33.463970" elapsed="0.010337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:33.474779" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:33.474521" elapsed="0.000320"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:33.480101" 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-11T00:48:33.479717" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:33.480675" 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-11T00:48:33.480362" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:33.480749" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:33.480907" 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-11T00:48:33.479330" elapsed="0.001602"/>
</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-11T00:48:33.481083" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:33.481756" level="INFO">${ds_type} = operational</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-11T00:48:33.481400" elapsed="0.000383"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:33.482180" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:33.481940" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:33.482615" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:33.482353" elapsed="0.000288"/>
</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-11T00:48:33.483035" 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-11T00:48:33.483306" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:33.483141" elapsed="0.000222"/>
</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-11T00:48:33.483546" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:33.483388" elapsed="0.000213"/>
</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-11T00:48:33.483766" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:33.483625" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:33.483122" elapsed="0.000719"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:33.482871" elapsed="0.000994"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:33.482687" elapsed="0.001204"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:33.483930" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:48:33.484132" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:33.484178" 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-11T00:48:33.478588" elapsed="0.005614"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:33.484660" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:33.484736" 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-11T00:48:33.484371" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:33.485329" 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-11T00:48:33.485045" elapsed="0.000358">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:33.484829" elapsed="0.000655">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:33.484811" elapsed="0.000706">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-11T00:48:33.485669" 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-11T00:48:33.485841" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:33.485906" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:33.475844" elapsed="0.010168">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:33.475613" elapsed="0.010469">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:33.475472" elapsed="0.010663">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:33.475064" elapsed="0.011161">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:33.486476" elapsed="0.000060"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:33.450581" elapsed="0.036051">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:34.512399" elapsed="0.000272"/>
</kw>
<msg time="2026-04-11T00:48:34.512744" 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-11T00:48:34.511727" elapsed="0.001088"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:34.511241" elapsed="0.001655"/>
</kw>
<msg time="2026-04-11T00:48:34.512944" 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-11T00:48:34.502929" elapsed="0.010059"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:34.502485" elapsed="0.010580"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:34.513563" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:34.513284" elapsed="0.000325"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:34.518703" 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-11T00:48:34.518293" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:34.519177" 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-11T00:48:34.518892" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:34.519252" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:48:34.519417" 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-11T00:48:34.517922" elapsed="0.001536"/>
</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-11T00:48:34.519612" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:34.520258" level="INFO">${ds_type} = operational</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-11T00:48:34.519925" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:34.520698" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:34.520458" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:34.521099" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:34.520868" elapsed="0.000256"/>
</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-11T00:48:34.521549" 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-11T00:48:34.521812" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:34.521661" elapsed="0.000216"/>
</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-11T00:48:34.522043" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:34.521903" 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-11T00:48:34.522259" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:34.522119" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:34.521641" elapsed="0.000692"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:34.521353" elapsed="0.001004"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:34.521171" elapsed="0.001216"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:34.522443" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:48:34.522644" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:34.522690" 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-11T00:48:34.517160" elapsed="0.005552"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:34.523250" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:34.523328" 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-11T00:48:34.522975" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:34.524146" 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-11T00:48:34.523665" elapsed="0.000560">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:34.523446" elapsed="0.000851">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:34.523406" elapsed="0.000924">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-11T00:48:34.524505" elapsed="0.000023"/>
</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-11T00:48:34.524681" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:34.524745" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:34.514654" elapsed="0.010198">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:34.514395" elapsed="0.010525">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:34.514241" elapsed="0.010733">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:34.513839" elapsed="0.011224">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:34.525295" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:34.487691" elapsed="0.037724">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:35.553138" elapsed="0.000270"/>
</kw>
<msg time="2026-04-11T00:48:35.553492" 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-11T00:48:35.552488" elapsed="0.001072"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:35.552009" elapsed="0.001632"/>
</kw>
<msg time="2026-04-11T00:48:35.553687" 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-11T00:48:35.543699" elapsed="0.010060"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:35.543254" elapsed="0.010604"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:35.554389" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:35.554092" elapsed="0.000366"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:35.559981" 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-11T00:48:35.559509" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:35.560485" 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-11T00:48:35.560172" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:35.560560" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:35.560718" 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-11T00:48:35.559072" elapsed="0.001670"/>
</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-11T00:48:35.560991" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:35.561897" level="INFO">${ds_type} = operational</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-11T00:48:35.561325" elapsed="0.000600"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:35.562355" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:35.562108" elapsed="0.000274"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:35.562793" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:35.562551" elapsed="0.000268"/>
</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-11T00:48:35.563241" 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-11T00:48:35.563535" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:35.563353" elapsed="0.000242"/>
</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-11T00:48:35.563764" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:35.563621" elapsed="0.000198"/>
</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-11T00:48:35.563986" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:35.563843" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:35.563334" elapsed="0.000729"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:35.563066" elapsed="0.001022"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:35.562867" elapsed="0.001252"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:35.564176" elapsed="0.000037"/>
</return>
<msg time="2026-04-11T00:48:35.564399" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:35.564465" 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-11T00:48:35.558312" elapsed="0.006178"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:35.564946" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:35.565025" 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-11T00:48:35.564666" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:35.565651" 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-11T00:48:35.565342" elapsed="0.000383">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:35.565120" elapsed="0.000671">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:35.565102" elapsed="0.000720">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-11T00:48:35.565976" 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-11T00:48:35.566215" elapsed="0.000032"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:35.566298" elapsed="0.000016"/>
</return>
<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>
<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-11T00:48:35.555609" elapsed="0.010804">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:35.555295" elapsed="0.011206">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:35.555109" elapsed="0.011447">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:35.554690" elapsed="0.011953">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:35.566879" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:35.526540" elapsed="0.040454">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:36.591901" elapsed="0.000240"/>
</kw>
<msg time="2026-04-11T00:48:36.592211" 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-11T00:48:36.591124" elapsed="0.001152"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:36.590664" elapsed="0.001692"/>
</kw>
<msg time="2026-04-11T00:48:36.592405" 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-11T00:48:36.582241" elapsed="0.010223"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:36.581802" elapsed="0.010738"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:36.593031" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:36.592729" elapsed="0.000350"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:36.598490" 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-11T00:48:36.597996" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:36.599002" 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-11T00:48:36.598681" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:36.599078" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:36.599238" 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-11T00:48:36.597620" elapsed="0.001643"/>
</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-11T00:48:36.599433" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:36.600082" level="INFO">${ds_type} = operational</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-11T00:48:36.599748" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:36.600522" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:36.600265" elapsed="0.000284"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:36.600931" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:36.600695" 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-11T00:48:36.601347" 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-11T00:48:36.601660" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:36.601473" elapsed="0.000249"/>
</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-11T00:48:36.601894" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:36.601750" elapsed="0.000197"/>
</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-11T00:48:36.602109" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:36.601971" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:36.601453" elapsed="0.000729"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:36.601185" elapsed="0.001020"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:36.601005" elapsed="0.001226"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:36.602270" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:36.602487" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:36.602533" 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-11T00:48:36.596818" elapsed="0.005738"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:36.602993" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:36.603070" 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-11T00:48:36.602725" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:36.603719" 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-11T00:48:36.603434" elapsed="0.000363">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:36.603201" elapsed="0.000665">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:36.603184" elapsed="0.000714">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-11T00:48:36.604054" 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-11T00:48:36.604226" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:36.604292" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:36.594111" elapsed="0.010291">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:36.593882" elapsed="0.010605">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:36.593742" elapsed="0.010801">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:36.593325" elapsed="0.011308">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:36.604866" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:36.567932" elapsed="0.037050">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:37.632167" elapsed="0.000317"/>
</kw>
<msg time="2026-04-11T00:48:37.632573" 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-11T00:48:37.631520" elapsed="0.001122"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:37.631013" elapsed="0.001709"/>
</kw>
<msg time="2026-04-11T00:48:37.632768" 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-11T00:48:37.622794" elapsed="0.010018"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:37.622329" elapsed="0.010555"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:37.633337" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:37.633079" elapsed="0.000306"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:37.638531" 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-11T00:48:37.638115" elapsed="0.000443"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:37.638997" 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-11T00:48:37.638717" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:37.639068" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:48:37.639223" 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-11T00:48:37.637721" 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-11T00:48:37.639400" elapsed="0.000173"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:37.640059" level="INFO">${ds_type} = operational</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-11T00:48:37.639734" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:37.640515" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:37.640237" elapsed="0.000384"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:37.641089" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:37.640820" elapsed="0.000296"/>
</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-11T00:48:37.641546" 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-11T00:48:37.641809" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:37.641658" elapsed="0.000208"/>
</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-11T00:48:37.642053" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:37.641893" elapsed="0.000225"/>
</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-11T00:48:37.642286" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:37.642143" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:37.641638" elapsed="0.000724"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:37.641352" elapsed="0.001039"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:37.641166" elapsed="0.001268"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:37.642476" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:48:37.642679" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:37.642727" 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-11T00:48:37.636996" elapsed="0.005755"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:37.643192" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:37.643270" 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-11T00:48:37.642922" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:37.644066" 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-11T00:48:37.643778" elapsed="0.000362">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:37.643552" elapsed="0.000657">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:37.643346" elapsed="0.000896">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-11T00:48:37.644399" elapsed="0.000037"/>
</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-11T00:48:37.644591" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:37.644658" elapsed="0.000017"/>
</return>
<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>
<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-11T00:48:37.634398" elapsed="0.010402">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:37.634165" elapsed="0.010716">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:37.634025" elapsed="0.010915">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:37.633628" elapsed="0.011407">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:37.645269" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:37.606060" elapsed="0.039324">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:38.670237" elapsed="0.000252"/>
</kw>
<msg time="2026-04-11T00:48:38.670556" 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-11T00:48:38.669601" elapsed="0.001019"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:38.669133" elapsed="0.001564"/>
</kw>
<msg time="2026-04-11T00:48:38.670855" 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-11T00:48:38.661109" elapsed="0.009794"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:38.660687" elapsed="0.010292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:38.671444" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:38.671168" elapsed="0.000322"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:38.676649" 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-11T00:48:38.676248" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:38.677117" 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-11T00:48:38.676835" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:38.677190" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:38.677352" 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-11T00:48:38.675881" 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-11T00:48:38.677546" elapsed="0.000151"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:38.678185" level="INFO">${ds_type} = operational</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-11T00:48:38.677854" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:38.678620" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:38.678366" elapsed="0.000280"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:38.679023" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:38.678791" 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-11T00:48:38.679457" 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-11T00:48:38.679714" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:38.679567" 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-11T00:48:38.679944" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:38.679793" elapsed="0.000205"/>
</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-11T00:48:38.680160" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:38.680021" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:38.679548" elapsed="0.000689"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:38.679275" elapsed="0.000986"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:38.679093" elapsed="0.001193"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:38.680324" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:38.680539" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:38.680585" 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-11T00:48:38.675136" elapsed="0.005472"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:38.681042" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:38.681123" 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-11T00:48:38.680776" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:38.681738" 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-11T00:48:38.681453" elapsed="0.000360">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:38.681215" elapsed="0.000668">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:38.681197" elapsed="0.000751">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-11T00:48:38.682109" 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-11T00:48:38.682283" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:38.682348" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:38.672511" elapsed="0.009962">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:38.672265" elapsed="0.010279">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:38.672126" elapsed="0.010472">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:38.671719" elapsed="0.010967">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:38.682917" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:38.646489" elapsed="0.036543">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:39.709209" elapsed="0.000248"/>
</kw>
<msg time="2026-04-11T00:48:39.709524" 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-11T00:48:39.708569" elapsed="0.001017"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:39.708073" elapsed="0.001591"/>
</kw>
<msg time="2026-04-11T00:48:39.709709" 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-11T00:48:39.700060" elapsed="0.009693"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:39.699654" elapsed="0.010174"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:39.710269" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:39.710015" elapsed="0.000300"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:39.715248" 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-11T00:48:39.714867" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:39.715755" 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-11T00:48:39.715456" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:39.715828" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:48:39.715985" 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-11T00:48:39.714500" elapsed="0.001509"/>
</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-11T00:48:39.716158" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:39.716819" level="INFO">${ds_type} = operational</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-11T00:48:39.716484" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:39.717242" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:39.717003" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:39.717671" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:39.717432" elapsed="0.000265"/>
</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-11T00:48:39.718087" 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-11T00:48:39.718461" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:39.718295" 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-11T00:48:39.718687" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:39.718545" elapsed="0.000198"/>
</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-11T00:48:39.718908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:39.718767" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:39.718274" elapsed="0.000711"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:39.717922" elapsed="0.001087"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:39.717744" elapsed="0.001291"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:39.719074" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:48:39.719271" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:39.719317" 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-11T00:48:39.713782" elapsed="0.005558"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:39.721359" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:39.721456" 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-11T00:48:39.719525" elapsed="0.001956"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:39.722058" 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-11T00:48:39.721773" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:39.721553" elapsed="0.000640">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:39.721534" elapsed="0.000692">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-11T00:48:39.722378" elapsed="0.000038"/>
</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-11T00:48:39.722570" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:39.722637" elapsed="0.000016"/>
</return>
<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>
<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-11T00:48:39.711298" elapsed="0.011445">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:39.711076" elapsed="0.011737">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:39.710939" elapsed="0.011928">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:39.710552" elapsed="0.012403">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:39.723184" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:39.684073" elapsed="0.039226">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:48:40.747798" elapsed="0.000249"/>
</kw>
<msg time="2026-04-11T00:48:40.748118" 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-11T00:48:40.747132" elapsed="0.001054"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:40.746668" elapsed="0.001598"/>
</kw>
<msg time="2026-04-11T00:48:40.748314" 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-11T00:48:40.738550" elapsed="0.009808"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:48:40.738095" elapsed="0.010355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.749010" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:40.748751" elapsed="0.000304"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:48:40.754263" 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-11T00:48:40.753871" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.754757" 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-11T00:48:40.754469" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:40.754830" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:48:40.754988" 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-11T00:48:40.753496" elapsed="0.001517"/>
</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-11T00:48:40.755165" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.755831" level="INFO">${ds_type} = operational</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-11T00:48:40.755496" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.756263" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:40.756015" elapsed="0.000279"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.756728" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:48:40.756466" elapsed="0.000289"/>
</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-11T00:48:40.757152" 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-11T00:48:40.757423" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:40.757259" elapsed="0.000222"/>
</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-11T00:48:40.757647" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:40.757507" elapsed="0.000194"/>
</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-11T00:48:40.757865" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:48:40.757725" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:48:40.757240" elapsed="0.000701"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:48:40.756986" elapsed="0.000978"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.756803" elapsed="0.001187"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:48:40.758029" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:48:40.758228" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:48:40.758275" 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-11T00:48:40.752763" elapsed="0.005536"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.758775" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:48:40.758851" 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-11T00:48:40.758500" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.759453" 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-11T00:48:40.759158" elapsed="0.000364">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:40.758944" elapsed="0.000644">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:40.758926" elapsed="0.000694">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-11T00:48:40.759772" 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-11T00:48:40.759945" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.760011" elapsed="0.000015"/>
</return>
<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>
<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-11T00:48:40.750061" elapsed="0.010093">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:48:40.749832" elapsed="0.010395">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:48:40.749691" elapsed="0.010592">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.749280" elapsed="0.011093">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.760625" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.724170" elapsed="0.036570">No leader found.</status>
</kw>
<msg time="2026-04-11T00:48:40.760856" level="FAIL">Keyword 'ClusterOpenFlow.Check OpenFlow Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: No leader found.</msg>
<arg>90s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check OpenFlow Shards Status</arg>
<arg>${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.309399" elapsed="90.451558">Keyword 'ClusterOpenFlow.Check OpenFlow Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: No leader found.</status>
</kw>
<doc>Check Shards Status after some cluster event.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.307399" elapsed="90.453663">Keyword 'ClusterOpenFlow.Check OpenFlow Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: No leader found.</status>
</kw>
<doc>Create original cluster list and check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:47:10.306865" elapsed="90.454340">Keyword 'ClusterOpenFlow.Check OpenFlow Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: No leader found.</status>
</test>
<test id="s1-s1-t36" name="Check Entity Owner Status After Recover" line="184">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.796172" 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-11T00:48:40.795794" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.796661" 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-11T00:48:40.796358" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:40.796731" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:48:40.796883" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:40.795423" elapsed="0.001485"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:40.801472" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:40.801269" elapsed="0.000230"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:40.801675" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:40.802225" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:40.802020" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.802695" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:40.802446" elapsed="0.000290"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:40.802883" elapsed="0.000177"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:40.803430" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:40.803210" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.803864" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:40.803625" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.804396" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:40.804056" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.804840" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:40.804602" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.805312" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:40.805031" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:40.811882" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:40.820467" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.821221" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:40.820842" elapsed="0.000405"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:40.822382" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.821851" elapsed="0.000695">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.822704" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.821458" elapsed="0.001360">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.822993" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.823167" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.823341" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.823535" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.823701" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.823865" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.824030" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.824203" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.824372" elapsed="0.000036"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.824650" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.824874" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.825064" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:40.824522" elapsed="0.000623"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.824456" elapsed="0.000716"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.825311" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.825370" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.819969" elapsed="0.005527">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.825565" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.809693" elapsed="0.015971">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.825838" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.830069" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.830265" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.830331" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.800733" elapsed="0.029720">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:40.830567" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:40.830610" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:40.800160" elapsed="0.030473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.830835" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:40.830724" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:40.830703" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:40.832215" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.832897" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:40.832595" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:40.833725" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.833460" elapsed="0.000352">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.833874" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.833102" elapsed="0.000876">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.834185" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.834357" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.834548" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.834714" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.834876" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.835037" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.835202" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.835370" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.835571" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.835831" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.836000" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.836158" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:40.835705" elapsed="0.000506"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.835638" elapsed="0.000599"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.836440" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.836503" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.831673" elapsed="0.004939">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:40.836728" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:40.836773" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:40.831048" elapsed="0.005748"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:40.837667" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.837097" elapsed="0.000633">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:40.836879" elapsed="0.000914">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:40.836860" elapsed="0.000966">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.837873" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.799616" elapsed="0.038357">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.838151" elapsed="0.000026"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.838338" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.838417" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:40.797204" elapsed="0.041317">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.838692" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.838872" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.839043" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.839205" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.839370" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:40.839552" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:40.839614" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.794767" elapsed="0.044948">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:41.869501" 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-11T00:48:41.869006" elapsed="0.000623"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:41.870114" 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-11T00:48:41.869807" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:41.870191" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:48:41.870370" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:41.868594" elapsed="0.001824"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:41.875204" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:41.875012" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:41.875385" elapsed="0.000208"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:41.875955" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:41.875746" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:41.876455" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:41.876164" elapsed="0.000334"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:41.876644" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:41.877181" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:41.876976" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:41.877640" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:41.877375" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:41.878174" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:41.877832" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:41.878624" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:41.878367" elapsed="0.000301"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:41.879101" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:41.878819" elapsed="0.000309"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:41.886246" elapsed="0.000296"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:41.895041" elapsed="0.000219"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:41.895860" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:41.895438" elapsed="0.000450"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:41.897079" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:41.896507" elapsed="0.000730">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:41.897449" elapsed="0.000025"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:41.896082" elapsed="0.001502">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.897766" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.897939" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.898116" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.898283" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.898465" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.898710" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.898879" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.899049" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.899212" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.899516" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.899745" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.899939" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:41.899365" elapsed="0.000653"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:41.899285" elapsed="0.000763"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.900193" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:41.900253" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:41.894503" elapsed="0.005863">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:41.900452" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:41.883661" elapsed="0.016893">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.900750" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.904940" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.905137" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:41.905204" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:41.874474" elapsed="0.030839">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:41.905507" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:41.905555" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:41.873887" elapsed="0.031691"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:41.905810" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:41.905673" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:41.905650" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:41.907230" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:41.907927" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:41.907612" elapsed="0.000341"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:41.908816" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:41.908544" elapsed="0.000385">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:41.908992" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:41.908186" elapsed="0.000911">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.909271" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.909476" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.909656" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.909824" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.909990" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.910154" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.910318" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.910506" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.910671" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.911117" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.911291" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.911477" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:41.910808" elapsed="0.000724"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:41.910738" elapsed="0.000822"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.911701" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:41.911761" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:41.906683" elapsed="0.005189">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:41.911990" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:41.912034" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:41.906030" elapsed="0.006027"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:41.912727" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:41.912367" elapsed="0.000426">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:41.912141" elapsed="0.000715">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:41.912122" elapsed="0.000771">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:41.912970" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:41.873145" elapsed="0.039927">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.913299" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.913486" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:41.913549" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:41.870724" elapsed="0.042928">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.913823" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.914003" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.914173" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.914334" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.914521" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:41.914687" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:41.914748" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:41.867670" elapsed="0.047180">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:42.945681" 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-11T00:48:42.945187" elapsed="0.000528"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:42.946183" 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-11T00:48:42.945887" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:42.946257" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:48:42.946451" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:42.944745" elapsed="0.001732"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:42.951131" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:42.950940" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:42.951310" elapsed="0.000209"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:42.951881" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:42.951673" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:42.952351" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:42.952090" elapsed="0.000326"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:42.952566" elapsed="0.000229"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:42.953164" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:42.952952" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:42.953894" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:42.953363" elapsed="0.000577"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:42.954482" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:42.954103" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:42.954934" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:42.954687" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:42.955452" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:42.955133" elapsed="0.000347"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:42.961796" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:42.970321" elapsed="0.000243"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:42.971098" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:42.970719" elapsed="0.000405"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:42.972250" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:42.971724" elapsed="0.000698">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:42.972585" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:42.971306" elapsed="0.001397">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.972877" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.973073" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.973250" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.973437" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.973603" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.973767" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.973930" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.974098" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.974259" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.974543" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.974768" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.974960" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:42.974412" elapsed="0.000629"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:42.974326" elapsed="0.000744"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.975215" elapsed="0.000025"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:42.975282" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:42.969830" elapsed="0.005582">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:42.975485" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:42.959590" elapsed="0.015995">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.975800" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.979983" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.980178" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:42.980244" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:42.950368" elapsed="0.029984">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:42.980524" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:42.980568" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:42.949763" elapsed="0.030828"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:42.980801" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:42.980676" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:42.980656" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:42.982421" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:42.983102" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:42.982799" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:42.984065" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:42.983659" elapsed="0.000494">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:42.984215" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:42.983306" elapsed="0.001013">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.984513" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.984686" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.984858" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.985024" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.985233" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.985428" elapsed="0.000026"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.985625" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.985813" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.985979" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.986283" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.986483" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.986647" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:42.986153" elapsed="0.000548"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:42.986084" elapsed="0.000644"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.986866" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:42.986926" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:42.981649" elapsed="0.005384">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:42.987147" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:42.987191" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:42.981017" elapsed="0.006198"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:42.987880" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:42.987557" elapsed="0.000386">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:42.987297" elapsed="0.000710">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:42.987279" elapsed="0.000760">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:42.988085" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:42.949202" elapsed="0.038982">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.988360" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.988548" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:42.988611" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:42.946799" elapsed="0.041912">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.988878" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.989056" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.989226" elapsed="0.000040"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.989424" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.989591" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:42.989751" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:42.989812" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:42.943917" elapsed="0.045992">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:44.019916" 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-11T00:48:44.019420" elapsed="0.000531"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:44.020444" 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-11T00:48:44.020128" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:44.020521" elapsed="0.000045"/>
</return>
<msg time="2026-04-11T00:48:44.020698" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:44.019005" elapsed="0.001718"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:44.025485" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:44.025276" elapsed="0.000236"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:44.025664" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:44.026213" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:44.026009" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:44.026702" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:44.026444" elapsed="0.000300"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:44.026887" elapsed="0.000209"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:44.027477" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:44.027249" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:44.027912" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:44.027671" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:44.028461" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:44.028104" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:44.028889" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:44.028655" elapsed="0.000276"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:44.029357" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:44.029079" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:44.035755" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:44.044324" elapsed="0.000230"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:44.045109" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:44.044711" elapsed="0.000425"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:44.046276" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:44.045744" elapsed="0.000709">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:44.046619" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:44.045323" elapsed="0.001416">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.046913" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.047085" elapsed="0.000083"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.047346" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.047542" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.047710" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.047882" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.048048" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.048218" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.048381" elapsed="0.000036"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.048799" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.049027" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.049219" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:44.048664" elapsed="0.000636"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:44.048471" elapsed="0.000858"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.049486" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:44.049548" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:44.043839" elapsed="0.005816">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:44.049724" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:44.033551" elapsed="0.016271">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.049996" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.054135" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.054329" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:44.054451" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:44.024742" elapsed="0.029819">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:44.054675" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:44.054719" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:44.024166" elapsed="0.030576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:44.054988" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:44.054869" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:44.054847" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:44.056364" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:44.057044" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:44.056743" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:44.057872" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:44.057610" elapsed="0.000347">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:44.058020" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:44.057251" elapsed="0.000871">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.058293" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.058489" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.058666" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.058836" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.059000" elapsed="0.000026"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.059170" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.059335" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.059551" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.059717" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.059968" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.060138" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.060297" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:44.059843" elapsed="0.000508"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:44.059781" elapsed="0.000595"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.060533" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:44.060593" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:44.055822" elapsed="0.004875">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:44.060810" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:44.060855" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:44.055206" elapsed="0.005672"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:44.061505" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:44.061171" elapsed="0.000396">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:44.060959" elapsed="0.000670">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:44.060941" elapsed="0.000720">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:44.061742" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:44.023616" elapsed="0.038226">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.062018" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.062184" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:44.062249" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:44.021022" elapsed="0.041325">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.062541" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.062722" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.062892" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.063054" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.063220" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:44.063388" elapsed="0.000033"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:44.063465" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:44.018148" elapsed="0.045428">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:45.094686" 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-11T00:48:45.094186" elapsed="0.000535"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:45.095197" 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-11T00:48:45.094894" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:45.095280" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:48:45.095512" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:45.093776" elapsed="0.001763"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:45.100330" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:45.100123" elapsed="0.000234"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:45.100532" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:45.101091" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:45.100880" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:45.101666" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:45.101369" elapsed="0.000357"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:45.101883" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:45.102466" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:45.102232" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:45.102942" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:45.102665" elapsed="0.000329"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:45.103523" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:45.103150" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:45.104008" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:45.103760" elapsed="0.000294"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:45.104516" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:45.104206" elapsed="0.000337"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:45.112993" elapsed="0.000225"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:45.121905" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:45.122681" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:45.122275" elapsed="0.000433"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:45.124060" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:45.123308" elapsed="0.000927">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:45.124417" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:45.122905" elapsed="0.001638">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.124720" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.124893" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.125078" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.125258" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.125443" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.125652" elapsed="0.000032"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.125894" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.126135" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.126369" elapsed="0.000050"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.126689" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.126940" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.127141" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:45.126556" elapsed="0.000669"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:45.126482" elapsed="0.000773"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.127415" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:45.127484" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:45.121407" elapsed="0.006270">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:45.127754" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:45.110681" elapsed="0.017222">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.128105" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.132462" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.132662" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:45.132731" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:45.099574" elapsed="0.033265">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:45.132955" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:45.133001" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:45.098964" elapsed="0.034060"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:45.133255" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:45.133123" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:45.133101" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:45.134714" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:45.135419" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:45.135081" elapsed="0.000366"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:45.136306" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:45.136032" elapsed="0.000387">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:45.136485" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:45.135632" elapsed="0.000961">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.136778" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.136952" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.137155" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.137331" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.137517" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.137721" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.137886" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.138057" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.138221" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.138497" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.138671" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.138832" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:45.138351" elapsed="0.000535"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:45.138286" elapsed="0.000626"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.139051" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:45.139111" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:45.134154" elapsed="0.005063">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:45.139331" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:45.139376" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:45.133491" elapsed="0.005925"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:45.140252" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:45.139718" elapsed="0.000596">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:45.139501" elapsed="0.000877">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:45.139483" elapsed="0.000946">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:45.140477" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:45.098406" elapsed="0.042171">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.140754" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.140921" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:45.140983" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:45.095875" elapsed="0.045213">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.141271" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.141468" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.141642" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.141804" elapsed="0.000053"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.142009" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:45.142173" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:45.142235" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:45.092977" elapsed="0.049358">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:46.174279" 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-11T00:48:46.173812" elapsed="0.000501"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:46.174812" 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-11T00:48:46.174511" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:46.174888" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:48:46.175055" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:46.173426" elapsed="0.001654"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:46.179707" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:46.179517" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:46.179884" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:46.180459" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:46.180229" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:46.180926" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:46.180672" elapsed="0.000296"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:46.181113" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:46.181669" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:46.181461" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:46.182119" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:46.181861" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:46.182695" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:46.182310" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:46.183142" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:46.182907" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:46.183632" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:46.183333" elapsed="0.000325"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:46.190153" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:46.198772" elapsed="0.000219"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:46.199561" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:46.199147" elapsed="0.000441"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:46.200709" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:46.200161" elapsed="0.000760">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:46.201084" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:46.199772" elapsed="0.001430">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.201379" elapsed="0.000040"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.201575" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.201752" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.201923" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.202094" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.202259" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.202445" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.202641" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.202907" elapsed="0.000026"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.203199" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.203445" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.203639" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:46.203060" elapsed="0.000660"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:46.202987" elapsed="0.000762"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.203891" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:46.203951" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:46.198258" elapsed="0.005800">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:46.204126" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:46.187958" elapsed="0.016267">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.204426" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.208617" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.208809" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:46.208876" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:46.178963" elapsed="0.030056">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:46.209134" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:46.209177" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:46.178348" elapsed="0.030853"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:46.209422" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:46.209288" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:46.209267" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:46.210786" elapsed="0.000244"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:46.211503" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:46.211182" elapsed="0.000347"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:46.212312" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:46.212046" elapsed="0.000381">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:46.212491" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:46.211709" elapsed="0.000887">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.212766" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.212939" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.213113" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.213285" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.213466" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.213631" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.213792" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.213961" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.214120" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.214375" elapsed="0.000040"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.214566" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.214726" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:46.214247" elapsed="0.000531"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:46.214184" elapsed="0.000620"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.214961" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:46.215021" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:46.210224" elapsed="0.004900">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:46.215235" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:46.215278" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:46.209639" elapsed="0.005661"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:46.216137" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:46.215821" elapsed="0.000377">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:46.215436" elapsed="0.000824">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:46.215415" elapsed="0.000877">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:46.216338" elapsed="0.000024"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:46.177800" elapsed="0.038659">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.216644" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.216808" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:46.216868" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:46.175379" elapsed="0.041587">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.217131" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.217308" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.217493" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.217656" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.217820" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:46.217980" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:46.218041" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:46.172627" elapsed="0.045511">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:47.252332" 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-11T00:48:47.251811" elapsed="0.000556"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:47.252868" 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-11T00:48:47.252565" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:47.252945" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:48:47.253117" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:47.251414" elapsed="0.001728"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:47.257867" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:47.257677" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:47.258052" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:47.258628" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:47.258414" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:47.259095" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:47.258839" elapsed="0.000299"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:47.259286" elapsed="0.000199"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:47.259856" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:47.259646" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:47.260327" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:47.260051" elapsed="0.000318"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:47.260888" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:47.260544" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:47.261320" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:47.261083" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:47.261818" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:47.261532" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:47.268776" elapsed="0.000223"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:47.277323" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:47.278097" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:47.277706" elapsed="0.000417"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:47.279268" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:47.278736" elapsed="0.000719">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:47.279639" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:47.278309" elapsed="0.001453">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.279937" elapsed="0.000027"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.280116" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.280313" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.280507" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.280673" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.280836" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.280998" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.281165" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.281326" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.281634" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.281923" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.282116" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:47.281504" elapsed="0.000693"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:47.281428" elapsed="0.000798"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.282368" elapsed="0.000189"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:47.282605" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:47.276836" elapsed="0.005881">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:47.282785" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:47.266161" elapsed="0.016724">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.283063" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.287227" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.287476" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:47.287545" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:47.257122" elapsed="0.030531">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:47.287767" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:47.287810" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:47.256566" elapsed="0.031266"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:47.288051" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:47.287920" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:47.287899" elapsed="0.000219"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:47.289477" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:47.290141" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:47.289837" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:47.290968" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:47.290703" elapsed="0.000353">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:47.291117" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:47.290347" elapsed="0.000875">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.291417" elapsed="0.000027"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.291619" elapsed="0.000060"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.291837" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.292007" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.292172" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.292336" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.292581" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.292754" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.292917" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.293320" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.293513" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.293677" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:47.293045" elapsed="0.000686"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:47.292982" elapsed="0.000776"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.293897" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:47.293956" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:47.288923" elapsed="0.005138">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:47.294172" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:47.294215" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:47.288269" elapsed="0.005968"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:47.294869" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:47.294548" elapsed="0.000382">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:47.294318" elapsed="0.000674">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:47.294300" elapsed="0.000724">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:47.295070" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:47.255979" elapsed="0.039191">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.295345" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.295536" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:47.295599" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:47.253547" elapsed="0.042152">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.295908" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.296086" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.296255" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.296468" elapsed="0.000023"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.296646" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:47.296810" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:47.296871" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:47.250563" elapsed="0.046409">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:48.328531" 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-11T00:48:48.328006" elapsed="0.000560"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:48.329058" 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-11T00:48:48.328757" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:48.329134" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:48:48.329305" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:48.327619" elapsed="0.001711"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:48.333926" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:48.333736" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:48.334104" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:48.334676" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:48.334466" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:48.335147" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:48.334890" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:48.335334" elapsed="0.000204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:48.335894" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:48.335690" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:48.336330" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:48.336086" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:48.337095" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:48.336561" elapsed="0.000561"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:48.337553" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:48.337291" elapsed="0.000306"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:48.338032" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:48.337748" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:48.344356" elapsed="0.000340"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:48.353073" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:48.353841" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:48.353459" elapsed="0.000409"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:48.355002" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:48.354467" elapsed="0.000686">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:48.355315" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:48.354055" elapsed="0.001399">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.355628" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.355798" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.355969" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.356135" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.356297" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.356475" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.356656" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.356827" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.356985" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.357254" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.357494" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.357688" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:48.357127" elapsed="0.000641"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:48.357057" elapsed="0.000740"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.357938" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:48.357998" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:48.352547" elapsed="0.005557">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:48.358174" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:48.342174" elapsed="0.016102">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.358470" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.362651" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.362885" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:48.362953" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:48.333175" elapsed="0.029886">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:48.363175" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:48.363219" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:48.332621" elapsed="0.030622"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:48.363466" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:48.363331" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:48.363310" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:48.364861" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:48.365551" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:48.365226" elapsed="0.000352"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:48.366355" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:48.366095" elapsed="0.000371">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:48.366530" elapsed="0.000158"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:48.365760" elapsed="0.001026">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.366961" elapsed="0.000026"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.367144" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.367320" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.367512" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.367680" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.367843" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.368006" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.368175" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.368337" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.368606" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.368835" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.369002" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:48.368480" elapsed="0.000575"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:48.368416" elapsed="0.000665"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.369219" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:48.369277" elapsed="0.000050"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:48.364276" elapsed="0.005162">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:48.369553" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:48.369596" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:48.363688" elapsed="0.005931"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:48.370228" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:48.369912" elapsed="0.000376">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:48.369700" elapsed="0.000652">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:48.369682" elapsed="0.000705">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:48.370448" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:48.332038" elapsed="0.038508">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.370722" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.370887" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:48.370949" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:48.329645" elapsed="0.041402">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.371215" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.371412" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.371584" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.371743" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.371908" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:48.372068" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:48.372130" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:48.326835" elapsed="0.045392">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:49.407609" 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-11T00:48:49.407118" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:49.408241" 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-11T00:48:49.407935" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:49.408319" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:48:49.408513" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:49.406702" elapsed="0.001836"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:49.413118" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:49.412920" elapsed="0.000224"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:49.413298" elapsed="0.000211"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:49.413871" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:49.413663" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:49.414576" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:49.414086" elapsed="0.000532"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:49.414766" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:49.415310" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:49.415098" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:49.415765" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:49.415520" elapsed="0.000317"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:49.416342" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:49.416001" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:49.416788" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:49.416552" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:49.417260" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:49.416980" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:49.423621" elapsed="0.000215"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:49.432333" elapsed="0.000255"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:49.433146" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:49.432753" elapsed="0.000421"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:49.434355" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:49.433816" elapsed="0.000713">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:49.434697" elapsed="0.000024"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:49.433412" elapsed="0.001412">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.435006" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.435180" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.435354" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.435541" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.435709" elapsed="0.000025"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.435883" elapsed="0.000127"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.436185" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.436358" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.436557" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.436842" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.437065" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.437258" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:49.436712" elapsed="0.000626"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:49.436634" elapsed="0.000734"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.437527" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:49.437587" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:49.431712" elapsed="0.005981">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:49.437762" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:49.421435" elapsed="0.016426">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.438040" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.442352" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.442610" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:49.442676" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:49.412363" elapsed="0.030422">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:49.442903" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:49.442947" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:49.411805" elapsed="0.031165"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:49.443198" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:49.443063" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:49.443041" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:49.444635" elapsed="0.000216"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:49.445314" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:49.445008" elapsed="0.000332"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:49.446145" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:49.445877" elapsed="0.000415">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:49.446356" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:49.445538" elapsed="0.000951">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.446661" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.446832" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.447007" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.447176" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.447342" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.447534" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.447700" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.447871" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.448074" elapsed="0.000025"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.448347" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.448535" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.448697" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:49.448216" elapsed="0.000535"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:49.448147" elapsed="0.000630"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.448917" elapsed="0.000026"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:49.448983" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:49.444071" elapsed="0.005017">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:49.449201" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:49.449244" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:49.443432" elapsed="0.005835"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:49.449903" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:49.449586" elapsed="0.000377">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:49.449348" elapsed="0.000679">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:49.449330" elapsed="0.000728">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:49.450104" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:49.411223" elapsed="0.038977">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.450375" elapsed="0.000039"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.450597" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:49.450660" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:49.408843" elapsed="0.041919">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.450932" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.451107" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.451274" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.451450" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.451618" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:49.451781" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:49.451841" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:49.405871" elapsed="0.046071">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:50.482728" 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-11T00:48:50.482248" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:50.483219" 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-11T00:48:50.482927" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:50.483293" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:48:50.483479" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:50.481845" elapsed="0.001660"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:50.488118" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:50.487929" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:50.488295" elapsed="0.000209"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:50.488864" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:50.488657" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:50.489327" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:50.489075" elapsed="0.000293"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:50.489534" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:50.490066" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:50.489864" elapsed="0.000227"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:50.490533" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:50.490272" elapsed="0.000304"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:50.491134" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:50.490727" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:50.491578" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:50.491324" elapsed="0.000297"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:50.492049" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:50.491768" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:50.498542" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:50.507089" elapsed="0.000228"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:50.507927" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:50.507491" elapsed="0.000464"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:50.509097" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:50.508568" elapsed="0.000679">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:50.509440" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:50.508144" elapsed="0.001421">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.509741" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.509915" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.510093" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.510263" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.510532" elapsed="0.000026"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.510711" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.510878" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.511044" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.511203" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.511486" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.511717" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.511908" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:50.511340" elapsed="0.000647"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:50.511270" elapsed="0.000745"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.512157" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:50.512215" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:50.506597" elapsed="0.005725">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:50.512408" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:50.496318" elapsed="0.016193">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.512743" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.516880" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.517074" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:50.517139" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:50.487373" elapsed="0.029872">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:50.517357" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:50.517453" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:50.486824" elapsed="0.030655"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:50.517701" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:50.517573" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:50.517551" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:50.519104" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:50.519788" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:50.519484" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:50.520612" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:50.520325" elapsed="0.000373">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:50.520760" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:50.519993" elapsed="0.000869">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.521032" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.521202" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.521374" elapsed="0.000043"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.521573" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.521737" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.521899" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.522062" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.522231" elapsed="0.001898"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.524289" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.524572" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.524744" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.524903" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:50.524437" elapsed="0.000558"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:50.524356" elapsed="0.000666"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.525161" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:50.525220" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:50.518567" elapsed="0.006758">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:50.525457" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:50.525501" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:50.517916" elapsed="0.007608"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:50.526149" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:50.525824" elapsed="0.000388">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:50.525606" elapsed="0.000667">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:50.525588" elapsed="0.000717">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:50.526350" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:50.486168" elapsed="0.040326">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.526672" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.526835" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:50.526896" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:50.483801" elapsed="0.043192">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.527158" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.527332" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.527519" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.527680" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.527844" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:50.528008" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:50.528068" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:50.481078" elapsed="0.047087">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:51.557973" 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-11T00:48:51.557493" elapsed="0.000517"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:51.558515" 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-11T00:48:51.558196" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:51.558591" elapsed="0.000050"/>
</return>
<msg time="2026-04-11T00:48:51.558774" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:51.557067" elapsed="0.001732"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:51.563526" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:51.563307" elapsed="0.000255"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:51.563729" elapsed="0.000227"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:51.564335" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:51.564126" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:51.564853" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:51.564563" elapsed="0.000332"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:51.565043" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:51.565600" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:51.565373" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:51.566044" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:51.565794" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:51.566596" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:51.566236" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:51.567216" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:51.566786" elapsed="0.000475"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:51.567716" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:51.567426" elapsed="0.000316"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:51.574116" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:51.582747" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:51.583596" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:51.583157" elapsed="0.000465"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:51.584786" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:51.584230" elapsed="0.000708">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:51.585098" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:51.583809" elapsed="0.001406">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.585407" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.585588" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.585764" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.585933" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.586162" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.586326" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.586509" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.586681" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.586842" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.587111" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.587333" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.587542" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:51.586983" elapsed="0.000640"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:51.586911" elapsed="0.000741"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.587797" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:51.587857" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:51.582239" elapsed="0.005745">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:51.588055" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:51.571933" elapsed="0.016223">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.588330" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.592607" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.592803" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:51.592870" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:51.562762" elapsed="0.030213">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:51.593088" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:51.593132" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:51.562106" elapsed="0.031049"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:51.593356" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:51.593242" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:51.593221" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:51.594730" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:51.595452" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:51.595129" elapsed="0.000350"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:51.596291" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:51.596023" elapsed="0.000354">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:51.596463" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:51.595665" elapsed="0.000903">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.596741" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.596913" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.597086" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.597255" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.597437" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.597601" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.597764" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.597934" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.598095" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.598522" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.598702" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.598864" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:51.598224" elapsed="0.000694"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:51.598159" elapsed="0.000785"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.599084" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:51.599144" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:51.594174" elapsed="0.005076">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:51.599361" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:51.599422" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:51.593588" elapsed="0.005859"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:51.600084" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:51.599742" elapsed="0.000403">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:51.599529" elapsed="0.000678">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:51.599511" elapsed="0.000728">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:51.600284" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:51.561557" elapsed="0.038824">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.600611" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.600778" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:51.600841" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:51.559100" elapsed="0.041839">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.601108" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.601286" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.601473" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.601638" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.601805" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:51.601969" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:51.602031" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:51.556225" elapsed="0.045904">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:52.637000" 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-11T00:48:52.636495" elapsed="0.000539"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:52.637523" 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-11T00:48:52.637209" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:52.637599" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:48:52.637771" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:52.636068" elapsed="0.001729"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:52.642356" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:52.642165" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:52.642552" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:52.643106" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:52.642898" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:52.643596" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:52.643320" elapsed="0.000318"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:52.643785" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:52.644319" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:52.644114" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:52.644889" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:52.644608" elapsed="0.000325"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:52.645449" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:52.645086" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:52.645883" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:52.645643" elapsed="0.000294"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:52.646624" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:52.646112" elapsed="0.000539"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:52.653090" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:52.661718" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:52.662492" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:52.662082" elapsed="0.000438"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:52.663665" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:52.663113" elapsed="0.000702">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:52.663978" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:52.662709" elapsed="0.001392">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.664275" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.664466" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.664643" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.664813" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.664991" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.665157" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.665322" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.665513" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.665675" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.665946" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.666169" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.666361" elapsed="0.000024"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:52.665817" elapsed="0.000645"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:52.665746" elapsed="0.000746"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.666644" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:52.666705" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:52.661213" elapsed="0.005598">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:52.666881" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:52.650881" elapsed="0.016145">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.667205" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.671433" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.671637" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:52.671704" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:52.641628" elapsed="0.030181">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:52.671922" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:52.671965" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:52.641062" elapsed="0.030926"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:52.672202" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:52.672077" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:52.672055" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:52.673618" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:52.674281" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:52.673978" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:52.675103" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:52.674840" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:52.675252" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:52.674505" elapsed="0.000849">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.675552" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.675727" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.675902" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.676071" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.676236" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.676413" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.676581" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.676750" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.676911" elapsed="0.000085"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.677407" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.677589" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.677752" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:52.677261" elapsed="0.000544"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:52.677046" elapsed="0.000785"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.677971" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:52.678030" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:52.673062" elapsed="0.005074">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:52.678248" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:52.678292" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:52.672458" elapsed="0.005856"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:52.678946" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:52.678628" elapsed="0.000380">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:52.678413" elapsed="0.000657">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:52.678378" elapsed="0.000725">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:52.679149" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:52.640503" elapsed="0.038743">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.679437" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.679605" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:52.679667" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:52.638095" elapsed="0.041670">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.679935" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.680111" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.680280" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.680458" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.680627" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:52.680791" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:52.680852" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:52.635234" elapsed="0.045771">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:53.710773" 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-11T00:48:53.710272" elapsed="0.000534"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:53.711280" 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-11T00:48:53.710981" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:53.711356" elapsed="0.000058"/>
</return>
<msg time="2026-04-11T00:48:53.711549" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:53.709881" elapsed="0.001696"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:53.716188" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:53.715997" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:53.716367" elapsed="0.000208"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:53.716994" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:53.716730" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:53.717502" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:53.717226" elapsed="0.000318"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:53.717692" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:53.718226" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:53.718022" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:53.718678" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:53.718436" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:53.719427" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:53.718871" elapsed="0.000583"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:53.719862" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:53.719623" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:53.720339" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:53.720057" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:53.726776" elapsed="0.000264"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:53.736106" elapsed="0.000218"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:53.736908" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:53.736502" elapsed="0.000432"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:53.738226" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:53.737620" elapsed="0.000766">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:53.738568" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:53.737126" elapsed="0.001607">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.738913" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.739155" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.739334" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.739523" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.739696" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.739861" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.740026" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.740195" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.740355" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.740645" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.740871" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.741062" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:53.740516" elapsed="0.000625"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:53.740444" elapsed="0.000726"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.741337" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:53.741412" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:53.735602" elapsed="0.005921">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:53.741597" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:53.724552" elapsed="0.017143">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.741868" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.746030" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.746225" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:53.746291" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:53.715460" elapsed="0.030994">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:53.746572" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:53.746617" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:53.714880" elapsed="0.031760"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:53.746897" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:53.746769" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:53.746747" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:53.748268" elapsed="0.000228"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:53.749004" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:53.748655" elapsed="0.000375"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:53.749875" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:53.749609" elapsed="0.000353">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:53.750024" elapsed="0.000161"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:53.749210" elapsed="0.001067">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.750476" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.750651" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.750824" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.750992" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.751155" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.751316" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.751496" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.751671" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.751833" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.752085" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.752255" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.752429" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:53.751960" elapsed="0.000523"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:53.751896" elapsed="0.000614"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.752649" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:53.752708" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:53.747730" elapsed="0.005081">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:53.752922" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:53.752966" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:53.747116" elapsed="0.005872"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:53.753648" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:53.753307" elapsed="0.000401">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:53.753068" elapsed="0.000703">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:53.753049" elapsed="0.000792">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:53.753891" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:53.714315" elapsed="0.039675">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.754166" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.754332" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:53.754409" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:53.711882" elapsed="0.042631">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.754682" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.754858" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.755027" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.755186" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.755352" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:53.755534" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:53.755595" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:53.709035" elapsed="0.046660">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:54.786173" 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-11T00:48:54.785659" elapsed="0.000551"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:54.786716" 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-11T00:48:54.786404" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:54.786793" elapsed="0.000049"/>
</return>
<msg time="2026-04-11T00:48:54.786977" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:54.785220" elapsed="0.001781"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:54.791662" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:54.791467" elapsed="0.000224"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:54.791842" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:54.792420" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:54.792190" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:54.793218" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:54.792723" elapsed="0.000540"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:54.793430" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:54.793986" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:54.793774" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:54.794445" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:54.794179" elapsed="0.000308"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:54.795001" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:54.794645" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:54.795456" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:54.795195" elapsed="0.000306"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:54.795937" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:54.795652" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:54.802343" elapsed="0.000257"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:54.810969" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:54.811741" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:54.811337" elapsed="0.000431"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:54.812902" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:54.812346" elapsed="0.000752">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:54.813266" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:54.811954" elapsed="0.001449">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.813583" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.813758" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.813934" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.814106" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.814271" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.814453" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.814621" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.814788" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.814949" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.815218" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.815459" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.815657" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:54.815089" elapsed="0.000649"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:54.815019" elapsed="0.000750"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.815910" elapsed="0.000056"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:54.816008" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:54.810477" elapsed="0.005642">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:54.816188" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:54.800094" elapsed="0.016196">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.816484" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.820848" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.821050" elapsed="0.000046"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:54.821153" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:54.790908" elapsed="0.030355">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:54.821377" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:54.821479" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:54.790320" elapsed="0.031183"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:54.821718" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:54.821599" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:54.821573" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:54.823183" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:54.823872" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:54.823566" elapsed="0.000332"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:54.824703" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:54.824435" elapsed="0.000356">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:54.824854" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:54.824081" elapsed="0.000877">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.825173" elapsed="0.000025"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.825352" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.825552" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.825723" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.825928" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.826097" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.826264" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.826452" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.826618" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.826875" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.827046" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.827207" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:54.826747" elapsed="0.000513"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:54.826683" elapsed="0.000603"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.827441" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:54.827503" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:54.822631" elapsed="0.004977">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:54.827720" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:54.827763" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:54.821996" elapsed="0.005789"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:54.828415" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:54.828079" elapsed="0.000399">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:54.827866" elapsed="0.000675">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:54.827848" elapsed="0.000725">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:54.828620" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:54.789726" elapsed="0.038992">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.828933" elapsed="0.000031"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.829165" elapsed="0.000025"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:54.829235" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:54.787301" elapsed="0.042039">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.829538" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.829741" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.829913" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.830125" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.830297" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:54.830479" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:54.830543" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:54.784361" elapsed="0.046287">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:55.861143" 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-11T00:48:55.860660" elapsed="0.000517"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:55.861674" 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-11T00:48:55.861348" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:55.861751" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:48:55.861924" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:55.860228" elapsed="0.001722"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:55.866550" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:55.866342" elapsed="0.000235"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:55.866734" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:55.867286" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:55.867078" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:55.867782" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:55.867521" elapsed="0.000302"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:55.867969" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:55.868578" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:55.868301" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:55.869022" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:55.868775" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:55.869577" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:55.869214" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:55.870006" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:55.869770" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:55.870495" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:55.870197" elapsed="0.000323"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:55.876957" elapsed="0.000216"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:55.885467" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:55.886211" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:55.885829" elapsed="0.000408"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:55.887472" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:55.886921" elapsed="0.000704">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:55.887935" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:55.886510" elapsed="0.001543">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.888228" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.888418" elapsed="0.000054"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.888631" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.888800" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.888964" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.889125" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.889287" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.889469" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.889630" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.889895" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.890117" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.890306" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:55.889768" elapsed="0.000632"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:55.889697" elapsed="0.000735"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.890576" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:55.890636" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:55.884967" elapsed="0.005777">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:55.890812" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:55.874749" elapsed="0.016162">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.891110" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.895301" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.895547" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:55.895655" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:55.865801" elapsed="0.029964">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:55.895877" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:55.895920" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:55.865224" elapsed="0.030718"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:55.896145" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:55.896030" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:55.896008" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:55.897554" elapsed="0.000228"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:55.898245" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:55.897941" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:55.899081" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:55.898815" elapsed="0.000353">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:55.899231" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:55.898472" elapsed="0.000863">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.899531" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.899736" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.899915" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.900081" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.900243" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.900420" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.900658" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.900836" elapsed="0.000161"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.901147" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.901420" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.901592" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.901752" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:55.901276" elapsed="0.000527"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:55.901212" elapsed="0.000617"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.901966" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:55.902024" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:55.896992" elapsed="0.005138">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:55.902244" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:55.902326" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:55.896361" elapsed="0.005989"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:55.902984" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:55.902671" elapsed="0.000374">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:55.902450" elapsed="0.000658">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:55.902430" elapsed="0.000710">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:55.903185" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:55.864667" elapsed="0.038615">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.903474" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.903642" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:55.903703" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:55.862249" elapsed="0.041552">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.903968" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.904145" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.904314" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.904502" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.904676" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:55.904838" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:55.904898" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:55.859452" elapsed="0.045545">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:56.939060" 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-11T00:48:56.938564" elapsed="0.000532"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:56.939610" 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-11T00:48:56.939271" elapsed="0.000373"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:56.939693" elapsed="0.000049"/>
</return>
<msg time="2026-04-11T00:48:56.939875" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:56.938156" elapsed="0.001743"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:56.944556" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:56.944341" elapsed="0.000241"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:56.944733" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:56.945287" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:56.945072" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:56.945769" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:56.945514" elapsed="0.000296"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:56.945955" elapsed="0.000177"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:56.948565" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:56.946281" elapsed="0.002311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:56.949017" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:56.948766" elapsed="0.000294"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:56.949574" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:56.949212" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:56.950005" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:56.949766" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:56.950504" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:56.950200" elapsed="0.000331"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:56.956859" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:56.965504" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:56.966242" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:56.965867" elapsed="0.000402"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:56.967413" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:56.966870" elapsed="0.000715">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:56.967748" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:56.966477" elapsed="0.001394">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.968047" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.968225" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.968416" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.968594" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.968792" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.968955" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.969116" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.969284" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.969463" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.969731" elapsed="0.000073"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.970013" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.970209" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:56.969603" elapsed="0.000687"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:56.969532" elapsed="0.000788"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.970481" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:56.970543" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:56.965000" elapsed="0.005651">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:56.970722" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:56.954648" elapsed="0.016173">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.970996" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.975127" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.975318" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:56.975436" elapsed="0.000020"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:56.943806" elapsed="0.031772">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:56.975695" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:56.975738" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:56.943214" elapsed="0.032547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:56.975967" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:56.975847" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:56.975827" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:56.977328" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:56.978006" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:56.977706" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:56.978830" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:56.978567" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:56.978979" elapsed="0.000165"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:56.978213" elapsed="0.001023">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.979435" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.979672" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.979850" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.980019" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.980186" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.980350" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.980533" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.980706" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.980869" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.981122" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.981293" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.981469" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:56.980997" elapsed="0.000526"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:56.980933" elapsed="0.000616"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.981687" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:56.981747" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:56.976791" elapsed="0.005060">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:56.981963" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:56.982006" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:56.976184" elapsed="0.005845"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:56.982652" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:56.982321" elapsed="0.000391">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:56.982110" elapsed="0.000664">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:56.982092" elapsed="0.000713">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:56.982851" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:56.942665" elapsed="0.040283">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.983120" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.983284" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:56.983345" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:56.940282" elapsed="0.043177">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.983678" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.983858" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.984027" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.984187" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.984352" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:56.984542" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:56.984604" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:56.937310" elapsed="0.047398">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:58.015593" 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-11T00:48:58.015089" elapsed="0.000539"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:58.016126" 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-11T00:48:58.015804" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:58.016203" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:48:58.016376" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:58.014690" elapsed="0.001728"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:58.021076" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:58.020886" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:58.021261" elapsed="0.000240"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:58.021887" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:58.021667" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:58.022492" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:58.022181" elapsed="0.000373"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:58.022708" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:58.023245" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:58.023041" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:58.023923" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:58.023452" elapsed="0.000513"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:58.024491" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:58.024122" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:58.024920" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:58.024684" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:58.025418" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:58.025113" elapsed="0.000333"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:58.031839" elapsed="0.000290"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:58.040536" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:58.041321" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:58.040903" elapsed="0.000444"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:58.042541" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:58.041956" elapsed="0.000740">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:58.042859" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:58.041562" elapsed="0.001420">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.043157" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.043330" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.043524" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.043694" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.043859" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.044063" elapsed="0.000031"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.044267" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.044459" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.044624" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.044898" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.045121" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.045313" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:58.044768" elapsed="0.000640"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:58.044695" elapsed="0.000743"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.045582" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:58.045642" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:58.040033" elapsed="0.005717">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:58.045820" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:58.029633" elapsed="0.016288">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.046095" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.050581" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.050833" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:58.050902" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:58.020317" elapsed="0.030695">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:58.051127" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:58.051173" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:58.019726" elapsed="0.031470"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:58.051431" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:58.051287" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:58.051265" elapsed="0.000248"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:58.052855" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:58.053585" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:58.053251" elapsed="0.000360"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:58.054504" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:58.054135" elapsed="0.000463">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:58.054663" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:58.053795" elapsed="0.000974">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.054942" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.055116" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.055292" elapsed="0.000210"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.055666" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.055835" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.056002" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.056167" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.056339" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.056521" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.056782" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.056955" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.057118" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:58.056654" elapsed="0.000516"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:58.056588" elapsed="0.000609"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.057337" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:58.057414" elapsed="0.000053"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:58.052289" elapsed="0.005275">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:58.057679" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:58.057724" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:58.051685" elapsed="0.006061"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:58.058404" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:58.058045" elapsed="0.000424">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:58.057828" elapsed="0.000706">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:58.057810" elapsed="0.000757">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:58.058613" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:58.019155" elapsed="0.039558">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.058892" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.059062" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:58.059125" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:58.016720" elapsed="0.042507">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.059422" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.059605" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.059776" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.059938" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.060108" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:58.060272" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:58.060334" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:58.013833" elapsed="0.046620">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:48:59.090741" 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-11T00:48:59.090229" elapsed="0.000553"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:48:59.091368" 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-11T00:48:59.091064" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:48:59.091461" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:48:59.091634" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:48:59.089831" elapsed="0.001828"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:48:59.096287" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:48:59.096098" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:59.096479" elapsed="0.000216"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:59.097060" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:59.096850" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:59.097543" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:59.097269" elapsed="0.000317"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:48:59.097732" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:59.098267" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:48:59.098062" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:59.098909" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:59.098471" elapsed="0.000480"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:59.099467" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:59.099104" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:48:59.099898" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:48:59.099659" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:48:59.100374" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:48:59.100091" elapsed="0.000324"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:59.106760" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:59.115354" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:59.116115" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:59.115733" elapsed="0.000409"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:59.117298" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:59.116770" elapsed="0.000706">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:59.117639" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:59.116325" elapsed="0.001439">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.117937" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.118112" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.118287" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.118502" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.118680" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.118850" elapsed="0.000059"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.119061" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.119232" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.119408" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.119691" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.119920" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.120113" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:59.119559" elapsed="0.000636"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:59.119483" elapsed="0.000742"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.120370" elapsed="0.000036"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:59.120448" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:59.114870" elapsed="0.005688">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:59.120638" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:48:59.104577" elapsed="0.016161">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.120912" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.125090" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.125284" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:48:59.125350" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:48:59.095556" elapsed="0.029955">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:59.125624" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:59.125667" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:59.094991" elapsed="0.030699"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:59.125893" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:48:59.125776" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T00:48:59.125756" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:48:59.127246" elapsed="0.000222"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:48:59.127925" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:48:59.127622" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:48:59.128912" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:48:59.128478" elapsed="0.000560">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:48:59.129104" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:48:59.128128" elapsed="0.001083">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.129406" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.129583" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.129757" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.129924" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.130089" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.130253" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.130434" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.130605" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.130772" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.131032" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.131200" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.131362" elapsed="0.000033"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:48:59.130906" elapsed="0.000524"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:48:59.130836" elapsed="0.000620"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.131596" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:59.131655" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:59.126708" elapsed="0.005051">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:48:59.131868" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:48:59.131912" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:48:59.126109" elapsed="0.005826"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:48:59.132559" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:48:59.132227" elapsed="0.000420">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:48:59.132015" elapsed="0.000702">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:48:59.131996" elapsed="0.000754">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:48:59.132797" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:48:59.094436" elapsed="0.038460">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.133075" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.133284" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:59.133350" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:48:59.091972" elapsed="0.041497">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.133639" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.133825" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.133996" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.134160" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.134327" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:48:59.134514" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:48:59.134577" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:48:59.088973" elapsed="0.045704">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:00.165520" 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-11T00:49:00.165036" elapsed="0.000519"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:00.166059" 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-11T00:49:00.165729" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:00.166148" elapsed="0.000049"/>
</return>
<msg time="2026-04-11T00:49:00.166346" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:00.164650" elapsed="0.001729"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:00.172084" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:00.171863" elapsed="0.000256"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:00.172299" elapsed="0.000243"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:00.172970" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:00.172721" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:00.173827" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:00.173235" elapsed="0.000643"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:00.174064" elapsed="0.000213"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:00.174764" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:00.174493" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:00.175333" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:00.175023" elapsed="0.000364"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:00.176050" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:00.175592" elapsed="0.000486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:00.176501" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:00.176246" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:00.177008" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:00.176714" elapsed="0.000321"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:00.183616" elapsed="0.000216"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:00.192663" elapsed="0.000295"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:00.193609" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:00.193163" elapsed="0.000473"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:00.194834" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:00.194234" elapsed="0.000767">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:00.195165" elapsed="0.000025"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:00.193841" elapsed="0.001458">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.195496" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.195688" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.195868" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.196040" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.196207" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.196374" elapsed="0.000038"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.196565" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.196741" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.196938" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.197228" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.197475" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.197672" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:00.197095" elapsed="0.000658"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:00.197018" elapsed="0.000764"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.197926" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:00.197986" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:00.191974" elapsed="0.006123">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:00.198169" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:00.181333" elapsed="0.016967">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.198597" elapsed="0.000024"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.203042" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.203241" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:00.203308" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:00.171188" elapsed="0.032242">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:00.203550" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:00.203593" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:00.170451" elapsed="0.033165"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:00.203895" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:00.203724" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:00.203692" elapsed="0.000296"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:00.205342" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:00.206028" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:00.205720" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:00.206917" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:00.206594" elapsed="0.000417">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:00.207072" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:00.206234" elapsed="0.000941">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.207342" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.207530" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.207703" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.207868" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.208031" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.208191" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.208353" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.208538" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.208700" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.208957" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.209126" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.209285" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:00.208830" elapsed="0.000544"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:00.208764" elapsed="0.000652"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.209557" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:00.209617" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:00.204799" elapsed="0.004922">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:00.209832" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:00.209876" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:00.204153" elapsed="0.005745"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:00.210524" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:00.210191" elapsed="0.000394">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:00.209978" elapsed="0.000669">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:00.209960" elapsed="0.000720">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:00.210725" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:00.169778" elapsed="0.041063">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.211019" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.211185" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:00.211246" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:00.166770" elapsed="0.044573">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.211528" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.211708" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.211878" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.212040" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.212208" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:00.212373" elapsed="0.000034"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:00.212451" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:00.163867" elapsed="0.048685">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:01.244493" 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-11T00:49:01.243983" elapsed="0.000547"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:01.245055" 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-11T00:49:01.244744" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:01.245133" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:49:01.245308" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:01.243560" elapsed="0.001772"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:01.250070" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:01.249877" elapsed="0.000220"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:01.250253" elapsed="0.000209"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:01.250847" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:01.250618" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:01.251335" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:01.251071" elapsed="0.000307"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:01.251544" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:01.252088" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:01.251881" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:01.252556" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:01.252282" elapsed="0.000315"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:01.253128" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:01.252782" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:01.253578" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:01.253322" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:01.254077" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:01.253790" elapsed="0.000313"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:01.260554" elapsed="0.000240"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:01.269209" elapsed="0.000222"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:01.270002" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:01.269586" elapsed="0.000448"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:01.271195" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:01.270666" elapsed="0.000682">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:01.271526" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:01.270224" elapsed="0.001421">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.271819" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.271990" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.272164" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.272331" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.272580" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.272771" elapsed="0.000029"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.272947" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.273118" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.273282" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.273568" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.273799" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.273993" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:01.273437" elapsed="0.000638"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:01.273351" elapsed="0.000752"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.274245" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:01.274306" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:01.268723" elapsed="0.005705">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:01.274499" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:01.258364" elapsed="0.016236">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.274775" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.278965" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.279169" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:01.279236" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:01.249296" elapsed="0.030051">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:01.279523" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:01.279567" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:01.248732" elapsed="0.030858"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:01.279813" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:01.279681" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:01.279660" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:01.281251" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:01.281996" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:01.281682" elapsed="0.000341"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:01.282845" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:01.282562" elapsed="0.000380">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:01.283005" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:01.282206" elapsed="0.000903">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.283280" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.283474" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.283651" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.283820" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.283984" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.284147" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.284311" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.284497" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.284663" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.285091" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.285261" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.285439" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:01.284959" elapsed="0.000536"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:01.284742" elapsed="0.000780"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.285663" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:01.285723" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:01.280657" elapsed="0.005172">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:01.285942" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:01.285987" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:01.280028" elapsed="0.005982"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:01.286648" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:01.286310" elapsed="0.000399">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:01.286094" elapsed="0.000678">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:01.286075" elapsed="0.000729">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:01.286851" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:01.248119" elapsed="0.038830">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.287166" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.287334" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:01.287412" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:01.245654" elapsed="0.041858">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.287683" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.287863" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.288035" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.288199" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.288365" elapsed="0.000035"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:01.288546" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:01.288609" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:01.242684" elapsed="0.046052">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:02.318899" 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-11T00:49:02.318442" elapsed="0.000490"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:02.319417" 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-11T00:49:02.319104" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:02.319494" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:49:02.319663" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:02.318030" elapsed="0.001658"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:02.324247" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:02.324061" elapsed="0.000213"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:02.324440" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:02.324988" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:02.324781" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:02.325465" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:02.325196" elapsed="0.000311"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:02.325651" elapsed="0.000177"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:02.326185" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:02.325978" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:02.326892" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:02.326478" elapsed="0.000456"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:02.327443" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:02.327086" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:02.327871" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:02.327636" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:02.328352" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:02.328064" elapsed="0.000314"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:02.334675" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:02.343207" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:02.343951" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:02.343582" elapsed="0.000395"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:02.345097" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:02.344571" elapsed="0.000679">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:02.345429" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:02.344160" elapsed="0.001386">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.345721" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.345894" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.346067" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.346233" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.346411" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.346610" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.346772" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.346938" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.347096" elapsed="0.000025"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.347368" elapsed="0.000039"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.347608" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.347797" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:02.347240" elapsed="0.000637"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:02.347170" elapsed="0.000736"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.348045" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:02.348103" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:02.342694" elapsed="0.005515">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:02.348278" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:02.332501" elapsed="0.015929">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.348607" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.352725" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.352915" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:02.352980" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:02.323525" elapsed="0.029558">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:02.353191" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:02.353234" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:02.322958" elapsed="0.030298"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:02.353510" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:02.353340" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:02.353320" elapsed="0.000258"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:02.354896" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:02.355567" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:02.355252" elapsed="0.000340"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:02.358565" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:02.356102" elapsed="0.002557">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:02.358722" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:02.355770" elapsed="0.003057">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.359000" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.359174" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.359350" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.359537" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.359702" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.359866" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.360029" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.360196" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.360360" elapsed="0.000070"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.360675" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.360849" elapsed="0.000027"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.361016" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:02.360547" elapsed="0.000521"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:02.360480" elapsed="0.000615"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.361232" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:02.361291" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:02.354315" elapsed="0.007093">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:02.361522" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:02.361566" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:02.353729" elapsed="0.007859"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:02.362201" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:02.361883" elapsed="0.000379">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:02.361669" elapsed="0.000655">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:02.361650" elapsed="0.000705">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:02.362416" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:02.322374" elapsed="0.040165">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.362715" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.362879" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:02.362941" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:02.319984" elapsed="0.043054">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.363202" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.363377" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.363561" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.363722" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.363888" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:02.364050" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:02.364110" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:02.317231" elapsed="0.047008">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:03.393648" 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-11T00:49:03.393165" elapsed="0.000517"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:03.394154" 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-11T00:49:03.393858" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:03.394228" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:49:03.394414" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:03.392772" elapsed="0.001668"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:03.399075" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:03.398886" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:03.399254" elapsed="0.000213"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:03.399847" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:03.399621" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:03.400340" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:03.400077" elapsed="0.000326"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:03.400553" elapsed="0.000398"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:03.401314" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:03.401106" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:03.401776" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:03.401525" elapsed="0.000293"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:03.402318" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:03.401970" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:03.402768" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:03.402530" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:03.403242" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:03.402961" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:03.409676" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:03.418249" elapsed="0.000264"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:03.419053" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:03.418672" elapsed="0.000407"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:03.420250" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:03.419681" elapsed="0.000745">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:03.420593" elapsed="0.000023"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:03.419263" elapsed="0.001458">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.420895" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.421132" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.421308" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.421498" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.421668" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.421834" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.422000" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.422170" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.422331" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.422621" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.422856" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.423050" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:03.422490" elapsed="0.000641"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:03.422417" elapsed="0.000745"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.423307" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:03.423367" elapsed="0.000029"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:03.417763" elapsed="0.005728">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:03.423560" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:03.407472" elapsed="0.016189">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.423836" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.428033" elapsed="0.000064"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.428269" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:03.428335" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:03.398328" elapsed="0.030167">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:03.428609" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:03.428653" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:03.397771" elapsed="0.030904"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:03.428967" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:03.428821" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:03.428794" elapsed="0.000239"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:03.430333" elapsed="0.000228"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:03.431019" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:03.430716" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:03.431984" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:03.431576" elapsed="0.000509">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:03.432149" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:03.431225" elapsed="0.001028">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.432449" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.432625" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.432804" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.432973" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.433137" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.433298" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.433478" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.433651" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.433812" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.434064" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.434233" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.434407" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:03.433939" elapsed="0.000522"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:03.433875" elapsed="0.000613"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.434627" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:03.434684" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:03.429792" elapsed="0.005001">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:03.434904" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:03.434947" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:03.429186" elapsed="0.005784"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:03.435598" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:03.435261" elapsed="0.000397">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:03.435049" elapsed="0.000671">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:03.435031" elapsed="0.000760">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:03.435840" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:03.397210" elapsed="0.038728">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.436138" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.436307" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:03.436369" elapsed="0.000030"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:03.394738" elapsed="0.041749">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.436654" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.436860" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.437041" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.437203" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.437368" elapsed="0.000035"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:03.437552" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:03.437613" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:03.391935" elapsed="0.045778">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:04.467411" 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-11T00:49:04.466927" elapsed="0.000519"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:04.467919" 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-11T00:49:04.467617" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:04.467995" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:49:04.468167" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:04.466528" elapsed="0.001664"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:04.472843" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:04.472650" elapsed="0.000220"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:04.473022" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:04.473605" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:04.473364" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:04.474173" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:04.473908" elapsed="0.000307"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:04.474361" elapsed="0.000200"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:04.475134" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:04.474712" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:04.475639" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:04.475359" elapsed="0.000322"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:04.476186" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:04.475839" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:04.476714" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:04.476406" elapsed="0.000364"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:04.477354" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:04.476976" elapsed="0.000432"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:04.484275" elapsed="0.000233"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:04.493673" elapsed="0.000232"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:04.494585" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:04.494112" elapsed="0.000500"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:04.495800" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:04.495191" elapsed="0.000769">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:04.496125" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:04.494801" elapsed="0.001449">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.496447" elapsed="0.000027"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.496642" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.496825" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.497018" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.497186" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.497353" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.497562" elapsed="0.000027"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.497756" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.497937" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.498213" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.498455" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.498656" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:04.498082" elapsed="0.000656"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:04.498009" elapsed="0.000760"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.498912" elapsed="0.000069"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:04.499023" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:04.493057" elapsed="0.006078">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:04.499205" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:04.481907" elapsed="0.017401">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.499509" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.503865" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.504064" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:04.504131" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:04.472093" elapsed="0.032147">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:04.504357" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:04.504417" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:04.471530" elapsed="0.032913"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:04.504660" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:04.504535" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:04.504513" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:04.506106" elapsed="0.000244"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:04.506845" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:04.506533" elapsed="0.000339"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:04.507849" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:04.507421" elapsed="0.000517">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:04.508002" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:04.507055" elapsed="0.001053">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.508281" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.508478" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.508656" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.508841" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.509054" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.509220" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.509401" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.509636" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.509810" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.510071" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.510259" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.510456" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:04.509943" elapsed="0.000572"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:04.509877" elapsed="0.000664"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.510700" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:04.510764" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:04.505553" elapsed="0.005324">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:04.510991" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:04.511035" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:04.504906" elapsed="0.006152"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:04.511698" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:04.511356" elapsed="0.000412">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:04.511141" elapsed="0.000692">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:04.511121" elapsed="0.000744">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:04.511910" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:04.470963" elapsed="0.041047">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.512187" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.512396" elapsed="0.000026"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:04.512468" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:04.468516" elapsed="0.044055">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.512745" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.512938" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.513116" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.513323" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.513554" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:04.513752" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:04.513820" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:04.465654" elapsed="0.048272">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:05.538936" 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-11T00:49:05.538470" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:05.539459" 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-11T00:49:05.539142" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:05.539536" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:49:05.539707" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:05.538033" elapsed="0.001699"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:05.544312" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:05.544125" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:05.544505" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:05.545063" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:05.544847" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:05.545760" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:05.545276" elapsed="0.000527"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:05.545952" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:05.546542" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:05.546317" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:05.546984" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:05.546738" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:05.547537" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:05.547176" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:05.547969" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:05.547731" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:05.548461" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:05.548161" elapsed="0.000326"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:05.554777" elapsed="0.000216"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:05.563287" elapsed="0.000226"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:05.564041" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:05.563667" elapsed="0.000400"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:05.565270" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:05.564740" elapsed="0.000698">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:05.565602" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:05.564317" elapsed="0.001403">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.565898" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.566072" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.566273" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.566470" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.566639" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.566809" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.566974" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.567144" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.567308" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.567589" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.567822" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.568022" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:05.567460" elapsed="0.000646"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:05.567376" elapsed="0.000781"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.568299" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:05.568361" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:05.562807" elapsed="0.005675">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:05.568558" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:05.552589" elapsed="0.016069">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.568833" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.573136" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.573330" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:05.573485" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:05.543587" elapsed="0.030008">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:05.573709" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:05.573754" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:05.543013" elapsed="0.030764"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:05.573997" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:05.573866" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:05.573846" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:05.575367" elapsed="0.000221"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:05.576053" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:05.575747" elapsed="0.000333"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:05.576882" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:05.576620" elapsed="0.000347">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:05.577029" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:05.576258" elapsed="0.000872">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.577299" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.577490" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.577665" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.577861" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.578028" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.578188" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.578349" elapsed="0.000045"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.578544" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.578715" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.578977" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.579147" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.579307" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:05.578846" elapsed="0.000514"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:05.578783" elapsed="0.000617"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.579542" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:05.579601" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:05.574830" elapsed="0.004884">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:05.579824" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:05.579904" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:05.574216" elapsed="0.005712"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:05.580550" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:05.580221" elapsed="0.000390">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:05.580010" elapsed="0.000665">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:05.579992" elapsed="0.000714">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:05.580752" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:05.542461" elapsed="0.038387">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.581028" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.581192" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:05.581253" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:05.540034" elapsed="0.041315">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.581533" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.581722" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.581893" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.582053" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.582215" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:05.582397" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:05.582460" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:05.537252" elapsed="0.045305">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:06.613911" 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-11T00:49:06.613426" elapsed="0.000519"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:06.614431" 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-11T00:49:06.614116" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:06.614508" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:49:06.614684" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:06.613012" elapsed="0.001698"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:06.619472" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:06.619257" elapsed="0.000242"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:06.619663" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:06.620218" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:06.620009" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:06.620725" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:06.620446" elapsed="0.000322"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:06.620920" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:06.621485" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:06.621255" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:06.621951" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:06.621701" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:06.622504" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:06.622144" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:06.622942" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:06.622703" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:06.623440" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:06.623135" elapsed="0.000332"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:06.630019" elapsed="0.000215"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:06.638677" elapsed="0.000222"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:06.639457" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:06.639056" elapsed="0.000427"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:06.640680" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:06.640111" elapsed="0.000732">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:06.641011" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:06.639670" elapsed="0.001460">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.641304" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.641495" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.641673" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.641850" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.642040" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.642205" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.642375" elapsed="0.000036"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.642563" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.642725" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.643006" elapsed="0.000057"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.643273" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.643483" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:06.642872" elapsed="0.000696"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:06.642794" elapsed="0.000805"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.643757" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:06.643820" elapsed="0.000031"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:06.638171" elapsed="0.005784">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:06.644024" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:06.627779" elapsed="0.016346">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.644299" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.648517" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.648711" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:06.648778" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:06.618715" elapsed="0.030169">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:06.649005" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:06.649048" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:06.618129" elapsed="0.030942"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:06.649273" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:06.649159" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:06.649138" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:06.650664" elapsed="0.000217"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:06.651346" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:06.651042" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:06.652217" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:06.651950" elapsed="0.000353">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:06.652365" elapsed="0.000040"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:06.651601" elapsed="0.000895">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.652671" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.652881" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.653072" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.653247" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.653433" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.653600" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.653765" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.653935" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.654116" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.654531" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.654706" elapsed="0.000027"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.654877" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:06.654397" elapsed="0.000533"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:06.654182" elapsed="0.000775"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.655105" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:06.655167" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:06.650107" elapsed="0.005166">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:06.655429" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:06.655476" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:06.649503" elapsed="0.005997"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:06.656123" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:06.655793" elapsed="0.000390">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:06.655580" elapsed="0.000666">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:06.655562" elapsed="0.000717">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:06.656324" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:06.617570" elapsed="0.038869">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.656615" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.656780" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:06.656846" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:06.615099" elapsed="0.041846">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.657167" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.657349" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.657538" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.657700" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.657866" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:06.658037" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:06.658101" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:06.612202" elapsed="0.045998">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:07.688737" 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-11T00:49:07.688241" elapsed="0.000531"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:07.689243" 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-11T00:49:07.688948" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:07.689317" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:49:07.689505" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:07.687841" elapsed="0.001688"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:07.694117" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:07.693930" elapsed="0.000213"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:07.694292" elapsed="0.000207"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:07.694857" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:07.694651" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:07.695317" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:07.695065" elapsed="0.000293"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:07.695517" elapsed="0.000177"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:07.696061" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:07.695851" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:07.696688" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:07.696249" elapsed="0.000481"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:07.697223" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:07.696886" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:07.697661" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:07.697427" elapsed="0.000276"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:07.698130" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:07.697850" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:07.704466" elapsed="0.000274"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:07.713019" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:07.713779" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:07.713403" elapsed="0.000403"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:07.714929" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:07.714401" elapsed="0.000679">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:07.715272" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:07.713992" elapsed="0.001429">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.715598" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.715771" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.715947" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.716115" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.716280" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.716460" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.716625" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.716791" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.716951" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.717215" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.717453" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.717645" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:07.717087" elapsed="0.000637"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:07.717019" elapsed="0.000734"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.717892" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:07.717951" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:07.712532" elapsed="0.005523">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:07.718123" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:07.702274" elapsed="0.015946">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.718405" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.722519" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.722745" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:07.722811" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:07.693393" elapsed="0.029538">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:07.723041" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:07.723084" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:07.692828" elapsed="0.030279"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:07.723307" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:07.723193" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:07.723173" elapsed="0.000261"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:07.724713" elapsed="0.000204"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:07.725540" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:07.725103" elapsed="0.000465"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:07.726526" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:07.726103" elapsed="0.000522">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:07.726689" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:07.725765" elapsed="0.001049">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.726986" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.727155" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.727335" elapsed="0.000032"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.727545" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.727711" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.727873" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.728034" elapsed="0.000027"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.728212" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.728371" elapsed="0.000034"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.728643" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.728813" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.728970" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:07.728517" elapsed="0.000505"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:07.728452" elapsed="0.000596"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.729185" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:07.729243" elapsed="0.000049"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:07.724163" elapsed="0.005236">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:07.729512" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:07.729555" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:07.723587" elapsed="0.005991"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:07.730185" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:07.729874" elapsed="0.000370">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:07.729660" elapsed="0.000646">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:07.729641" elapsed="0.000697">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:07.730398" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:07.692259" elapsed="0.038240">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.730681" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.730853" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:07.730913" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:07.689834" elapsed="0.041177">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.731177" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.731351" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.731546" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.731706" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.731875" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:07.732036" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:07.732097" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:07.686900" elapsed="0.045295">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:08.761401" 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-11T00:49:08.760906" elapsed="0.000531"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:08.761979" 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-11T00:49:08.761681" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:08.762054" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:49:08.762224" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:08.760523" elapsed="0.001726"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:08.768797" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:08.768610" elapsed="0.000213"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:08.768975" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:08.769539" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:08.769315" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:08.770001" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:08.769747" elapsed="0.000296"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:08.770188" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:08.770742" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:08.770535" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:08.771194" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:08.770947" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:08.771741" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:08.771400" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:08.772189" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:08.771947" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:08.772689" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:08.772405" elapsed="0.000310"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:08.779120" elapsed="0.000217"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:08.787720" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:08.788480" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:08.788079" elapsed="0.000427"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:08.789620" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:08.789077" elapsed="0.000696">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:08.789934" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:08.788690" elapsed="0.001362">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.790229" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.790417" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.790598" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.790776" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.790949" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.791112" elapsed="0.000061"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.791333" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.791537" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.791701" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.791974" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.792202" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.792415" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:08.791845" elapsed="0.000655"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:08.791771" elapsed="0.000759"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.792677" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:08.792738" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:08.787197" elapsed="0.005650">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:08.792916" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:08.776885" elapsed="0.016130">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.793212" elapsed="0.000027"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.797582" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.797798" elapsed="0.000027"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:08.797876" elapsed="0.000019"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:08.768043" elapsed="0.029946">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:08.798102" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:08.798146" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:08.767479" elapsed="0.030690"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:08.798399" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:08.798255" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:08.798234" elapsed="0.000237"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:08.799818" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:08.800492" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:08.800177" elapsed="0.000340"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:08.801296" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:08.801035" elapsed="0.000398">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:08.801497" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:08.800696" elapsed="0.000906">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.801774" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.801944" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.802117" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.802282" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.802461" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.802625" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.802788" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.802956" elapsed="0.000212"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.803420" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.803689" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.803866" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.804038" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:08.803557" elapsed="0.000536"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:08.803488" elapsed="0.000631"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.804260" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:08.804321" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:08.799244" elapsed="0.005205">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:08.804568" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:08.804613" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:08.798621" elapsed="0.006015"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:08.805281" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:08.804939" elapsed="0.000403">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:08.804719" elapsed="0.000703">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:08.804700" elapsed="0.000757">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:08.805504" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:08.766909" elapsed="0.038693">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.805781" elapsed="0.000028"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.806047" elapsed="0.000026"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:08.806121" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:08.762565" elapsed="0.043686">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.806447" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.806658" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.806832" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.807046" elapsed="0.000026"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.807237" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:08.807474" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:08.807563" elapsed="0.000022"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:08.759713" elapsed="0.047966">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:09.839031" 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-11T00:49:09.838562" elapsed="0.000502"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:09.839550" 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-11T00:49:09.839235" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:09.839626" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:49:09.839794" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:09.838164" elapsed="0.001655"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:09.844428" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:09.844203" elapsed="0.000253"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:09.844609" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:09.845159" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:09.844950" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:09.845639" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:09.845369" elapsed="0.000312"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:09.845828" elapsed="0.000185"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:09.846371" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:09.846165" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:09.846827" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:09.846581" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:09.847459" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:09.847020" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:09.847893" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:09.847653" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:09.848419" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:09.848085" elapsed="0.000361"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:09.855046" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:09.863715" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:09.864507" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:09.864098" elapsed="0.000436"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:09.865654" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:09.865108" elapsed="0.000701">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:09.865971" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:09.864717" elapsed="0.001372">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.866264" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.866453" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.866630" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.866800" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.866966" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.867129" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.867292" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.867483" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.867649" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.867972" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.868200" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.868414" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:09.867814" elapsed="0.000684"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:09.867732" elapsed="0.000794"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.868668" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:09.868729" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:09.863193" elapsed="0.005643">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:09.868905" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:09.852702" elapsed="0.016302">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.869217" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.873464" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.873658" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:09.873725" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:09.843661" elapsed="0.030170">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:09.873941" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:09.873984" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:09.843081" elapsed="0.030926"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:09.874211" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:09.874093" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:09.874072" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:09.875601" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:09.876278" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:09.875975" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:09.877105" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:09.876839" elapsed="0.000353">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:09.877253" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:09.876503" elapsed="0.000851">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.877540" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.877711" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.877884" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.878051" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.878223" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.878400" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.878567" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.878736" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.878898" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.879150" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.879318" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.879618" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:09.879025" elapsed="0.000687"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:09.878962" elapsed="0.000777"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.879881" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:09.879944" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:09.875034" elapsed="0.005014">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:09.880160" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:09.880204" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:09.874440" elapsed="0.005787"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:09.881033" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:09.880539" elapsed="0.000555">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:09.880308" elapsed="0.000849">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:09.880290" elapsed="0.000900">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:09.881235" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:09.842534" elapsed="0.038797">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.881523" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.881689" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:09.881751" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:09.840115" elapsed="0.041733">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.882014" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.882190" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.882359" elapsed="0.000033"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.882539" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.882706" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:09.882868" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:09.882929" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:09.837391" elapsed="0.045635">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.914548" 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-11T00:49:10.914062" elapsed="0.000520"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.915054" 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-11T00:49:10.914754" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:10.915131" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:49:10.915301" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:10.913674" elapsed="0.001652"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:10.919992" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:10.919801" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:10.920169" elapsed="0.000231"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:10.920769" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:10.920557" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.921242" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:10.920986" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:10.921479" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:10.922024" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:10.921821" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.922475" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:10.922216" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.923005" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:10.922668" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.923447" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:10.923198" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.923917" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:10.923638" elapsed="0.000304"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:10.930587" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:10.939369" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.940162" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:10.939754" elapsed="0.000434"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:10.941450" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:10.940851" elapsed="0.000798">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.941851" elapsed="0.000027"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:10.940447" elapsed="0.001566">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.942262" elapsed="0.000032"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.942529" elapsed="0.000032"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.942789" elapsed="0.000032"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.943038" elapsed="0.000032"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.943304" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.943501" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.943670" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.943860" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.944026" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.944298" elapsed="0.000027"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.944606" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.944803" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:10.944169" elapsed="0.000718"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.944096" elapsed="0.000820"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.945060" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.945120" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:10.938882" elapsed="0.006348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.945298" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:10.928340" elapsed="0.017084">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.945639" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.949978" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.950178" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.950244" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:10.919246" elapsed="0.031105">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:10.950514" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:10.950559" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:10.918687" elapsed="0.031895"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.950796" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:10.950672" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:10.950651" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:10.952281" elapsed="0.000309"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.953246" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:10.952837" elapsed="0.000448"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:10.954225" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:10.953947" elapsed="0.000367">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.954413" elapsed="0.000025"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:10.953560" elapsed="0.000979">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.954715" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.954887" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.955062" elapsed="0.000038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.955264" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.955449" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.955628" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.955793" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.955968" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.956132" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.956561" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.956737" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.956901" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:10.956260" elapsed="0.000693"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.956196" elapsed="0.000783"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.957119" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.957178" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:10.951703" elapsed="0.005583">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:10.957414" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:10.957461" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:10.951020" elapsed="0.006464"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.958113" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:10.957783" elapsed="0.000391">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:10.957565" elapsed="0.000673">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:10.957546" elapsed="0.000724">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.958316" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:10.918124" elapsed="0.040307">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.958668" elapsed="0.000026"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.958843" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.958906" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:10.915639" elapsed="0.043368">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.959174" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.959352" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.959592" elapsed="0.000028"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.959816" elapsed="0.000031"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.960052" elapsed="0.000031"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.960291" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.960361" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:10.912875" elapsed="0.047611">Could not parse owner and candidates for device openflow:1</status>
</kw>
<msg time="2026-04-11T00:49:10.960593" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.771648" elapsed="30.189036">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.960761" elapsed="0.000016"/>
</return>
<var>${new_owner}</var>
<var>${new_successors_list}</var>
<arg>openflow:1</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.769591" elapsed="30.191270">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.961048" elapsed="0.000022"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor.</doc>
<status status="FAIL" start="2026-04-11T00:48:40.761432" elapsed="30.199787">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</test>
<test id="s1-s1-t37" name="Check Network Operational Information After Recover" line="191">
<kw name="Check OpenFlow Network Operational Information For Sample Topology" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.968545" level="INFO">${dictionary} = {'openflow:1': '4', 'openflow:2': '5', 'openflow:3': '5'}</msg>
<var>${dictionary}</var>
<arg>openflow:1=4</arg>
<arg>openflow:2=5</arg>
<arg>openflow:3=5</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:49:10.968167" elapsed="0.000407"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.974598" 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-11T00:49:10.974199" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.975066" 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-11T00:49:10.974783" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:10.975205" elapsed="0.000035"/>
</return>
<msg time="2026-04-11T00:49:10.975411" 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-11T00:49:10.973830" elapsed="0.001609"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.979931" elapsed="0.000029"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.980214" elapsed="0.000027"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:10.975616" elapsed="0.004667"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.975493" elapsed="0.004827"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'openflow:1': '4', 'openflow:2': '5', 'openflow:3': '5'}.</doc>
<status status="PASS" start="2026-04-11T00:49:10.973256" elapsed="0.007146"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:49:10.968764" elapsed="0.011711"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.981049" level="INFO">${dictionary} = {'openflow:1': '21', 'openflow:2': '19', 'openflow:3': '19'}</msg>
<var>${dictionary}</var>
<arg>openflow:1=21</arg>
<arg>openflow:2=19</arg>
<arg>openflow:3=19</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:49:10.980708" elapsed="0.000368"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.987169" 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-11T00:49:10.986755" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:10.987729" 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-11T00:49:10.987356" elapsed="0.000401"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:10.987801" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:49:10.987957" 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-11T00:49:10.986361" elapsed="0.001620"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.992397" elapsed="0.000029"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:10.992649" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:10.988146" elapsed="0.004561"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:10.988032" elapsed="0.004701"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'openflow:1': '21', 'openflow:2': '19', 'openflow:3': '19'}.</doc>
<status status="PASS" start="2026-04-11T00:49:10.985811" elapsed="0.006976"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:49:10.981280" elapsed="0.011568"/>
</kw>
<doc>Check devices in tree,2 are in operational inventory and topology in all instances in ${controller_index_list}.
Inventory should show 1x node_id per device 1x node_id per connector. Topology should show 2x node_id per device + 3x node_id per connector
+ 5x node_id per link termination. TODO: A Keyword that can calculate this based on mininet topology.</doc>
<status status="PASS" start="2026-04-11T00:49:10.966168" elapsed="0.026754"/>
</kw>
<doc>Check devices in operational inventory and topology in all cluster instances.</doc>
<status status="PASS" start="2026-04-11T00:49:10.961531" elapsed="0.031517"/>
</test>
<test id="s1-s1-t38" name="Add Configuration In Owner and Verify After Recover" line="195">
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:11.005160" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.001603" elapsed="0.003598">Variable '${new_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:10.993225" elapsed="0.012112">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-t39" name="Modify Configuration In Owner and Verify After Recover" line="199">
<kw name="Modify Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:11.017116" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.013574" elapsed="0.003590">Variable '${new_owner}' not found.</status>
</kw>
<doc>Modify Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.005530" elapsed="0.011795">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-t40" name="Delete Configuration In Owner and Verify After Recover" line="203">
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:11.021954" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.018145" elapsed="0.003849">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.017591" elapsed="0.004532">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-t41" name="Add Configuration In Old Owner and Verify After Recover" line="207">
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:11.034186" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.030361" elapsed="0.003864">Variable '${original_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.022333" elapsed="0.012021">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-t42" name="Modify Configuration In Old Owner and Verify After Recover" line="211">
<kw name="Modify Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:11.046361" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.042595" elapsed="0.003834">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.034551" elapsed="0.012011">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-t43" name="Delete Configuration In Old Owner and Verify After Recover" line="215">
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:11.051113" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.047285" elapsed="0.003867">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.046736" elapsed="0.004543">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-t44" name="Send RPC Add to Owner and Verify After Recover" line="219">
<kw name="Send RPC Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:11.062945" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.059443" elapsed="0.003543">Variable '${new_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.051468" elapsed="0.011645">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-t45" name="Send RPC Delete to Owner and Verify After Recover" line="223">
<kw name="Send RPC Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:11.074952" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.071423" elapsed="0.003569">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.063285" elapsed="0.011836">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-t46" name="Send RPC Add to Old Owner and Verify After Recover" line="227">
<kw name="Send RPC Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:11.087734" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.083845" elapsed="0.003929">Variable '${original_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.075294" elapsed="0.012609">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-t47" name="Send RPC Delete to Old Owner and Verify After Recover" line="231">
<kw name="Send RPC Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:11.100919" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.096732" elapsed="0.004243">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.088083" elapsed="0.013077">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-t48" name="Modify Network and Verify After Recover" line="235">
<kw name="Take OpenFlow Device Link Down and Verify" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.108516" level="INFO">${dictionary} = {'"link-down":true': '1'}</msg>
<var>${dictionary}</var>
<arg>"link-down":true=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:49:11.108088" elapsed="0.000459"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<msg time="2026-04-11T00:49:11.119234" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<var>${ouput}</var>
<arg>${mininet_conn_id}</arg>
<arg>link s1 s2 down</arg>
<doc>Sends Command ${cmd} to Mininet session ${mininet_conn} and returns read buffer response.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.115444" elapsed="0.003829">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${operational_port_1}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.119489" elapsed="0.000022"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>${dictionary}</var>
<arg>openflow:1=16</arg>
<arg>openflow:2=14</arg>
<arg>openflow:3=19</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.119694" elapsed="0.000021"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>20s</arg>
<arg>2s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.119888" elapsed="0.000020"/>
</kw>
<doc>Take a link down and verify port status in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.105980" elapsed="0.014129">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Take a link down and verify port status in all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.101436" elapsed="0.018819">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s1-t49" name="Restore Network and Verify After Recover" line="239">
<kw name="Take OpenFlow Device Link Up and Verify" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.127159" level="INFO">${dictionary} = {'"link-down":true': '0'}</msg>
<var>${dictionary}</var>
<arg>"link-down":true=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:49:11.126847" elapsed="0.000341"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<msg time="2026-04-11T00:49:11.137987" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<var>${ouput}</var>
<arg>${mininet_conn_id}</arg>
<arg>link s1 s2 up</arg>
<doc>Sends Command ${cmd} to Mininet session ${mininet_conn} and returns read buffer response.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.134191" elapsed="0.003836">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${operational_port_1}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.138224" elapsed="0.000022"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>${dictionary}</var>
<arg>openflow:1=21</arg>
<arg>openflow:2=19</arg>
<arg>openflow:3=19</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.138440" elapsed="0.000020"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.138635" elapsed="0.000020"/>
</kw>
<doc>Take the link up and verify port status in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.124872" elapsed="0.013882">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Take the link up and verify port status in all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.120465" elapsed="0.018414">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s1-t50" name="Stop Mininet and Exit" line="243">
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<msg time="2026-04-11T00:49:11.147197" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="FAIL" start="2026-04-11T00:49:11.143246" elapsed="0.003991">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<status status="NOT RUN" start="2026-04-11T00:49:11.147466" elapsed="0.000025"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.139060" elapsed="0.008559">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s1-t51" name="Check No Network Operational Information" line="248">
<kw name="Check No OpenFlow Network Operational Information" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.154260" level="INFO">${dictionary} = {'openflow': '0'}</msg>
<var>${dictionary}</var>
<arg>openflow=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:49:11.153945" elapsed="0.000342"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_No_Content_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.160160" 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-11T00:49:11.159761" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.160659" 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-11T00:49:11.160346" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:11.160735" elapsed="0.000037"/>
</return>
<msg time="2026-04-11T00:49:11.160898" 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-11T00:49:11.159376" elapsed="0.001547"/>
</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-11T00:49:11.161274" elapsed="0.000023"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/opendaylight-inventory:nodes?content=nonconfig in ${session} using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.165248" elapsed="0.000028"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:11.161110" elapsed="0.004206"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.160981" elapsed="0.004365"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check there is no content.</doc>
<status status="PASS" start="2026-04-11T00:49:11.158849" elapsed="0.006571"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_No_Content_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:49:11.154483" elapsed="0.010990"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.165999" level="INFO">${dictionary} = {'openflow': '0'}</msg>
<var>${dictionary}</var>
<arg>openflow=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:49:11.165658" elapsed="0.000368"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.172284" 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-11T00:49:11.171888" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.172778" 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-11T00:49:11.172489" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:11.172849" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:49:11.173006" 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-11T00:49:11.171391" elapsed="0.001640"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.177448" elapsed="0.000036"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.177780" elapsed="0.000033"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:11.173196" elapsed="0.004668"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.173081" elapsed="0.004823"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'openflow': '0'}.</doc>
<status status="PASS" start="2026-04-11T00:49:11.170802" elapsed="0.007180"/>
</kw>
<arg>20s</arg>
<arg>2s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:49:11.166208" elapsed="0.011847"/>
</kw>
<doc>Check device is not in operational inventory or topology in all cluster instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-11T00:49:11.151981" elapsed="0.026159"/>
</kw>
<doc>Check device is not in operational inventory or topology in all cluster instances.</doc>
<status status="PASS" start="2026-04-11T00:49:11.147791" elapsed="0.030476"/>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-11T00:49:11.179316" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-11T00:49:11.179201" elapsed="0.000216"/>
</kw>
<doc>Test suite for Cluster HA - Device Owner failover</doc>
<status status="FAIL" start="2026-04-11T00:46:38.964757" elapsed="152.214705"/>
</suite>
<suite id="s1-s2" name="Cluster HA Owner Restart" source="/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustering/020__Cluster_HA_Owner_Restart.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-11T00:49:11.266523" 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-11T00:49:11.262364" elapsed="0.004215"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-11T00:49:11.262045" elapsed="0.004605"/>
</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-11T00:49:11.271507" 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-11T00:49:11.267751" elapsed="0.003794"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-11T00:49:11.271774" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:11.271646" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:11.271621" elapsed="0.000221"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.272334" 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-11T00:49:11.271995" elapsed="0.000382"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.272865" 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-11T00:49:11.272555" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:11.273533" elapsed="0.000321"/>
</kw>
<msg time="2026-04-11T00:49:11.273954" level="INFO">${status} = PASS</msg>
<msg time="2026-04-11T00:49:11.274002" 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-11T00:49:11.273070" elapsed="0.000955"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.274589" 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-11T00:49:11.274194" elapsed="0.000422"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.275598" 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-11T00:49:11.275314" elapsed="0.000312"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.276031" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:11.275775" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.276528" 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-11T00:49:11.276216" elapsed="0.000420"/>
</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-11T00:49:11.279370" elapsed="0.000041"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:11.279180" elapsed="0.000281"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.276700" elapsed="0.002790"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.280047" 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-11T00:49:11.279654" elapsed="0.000440"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.280809" 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-11T00:49:11.280287" elapsed="0.000583"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.281461" 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-11T00:49:11.281059" elapsed="0.000448"/>
</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-11T00:49:11.274868" elapsed="0.006698"/>
</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-11T00:49:11.267405" elapsed="0.014217"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.281804" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:11.281689" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:11.281670" 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-11T00:49:11.285306" 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-11T00:49:11.284799" elapsed="0.000546"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.285929" 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-11T00:49:11.285582" elapsed="0.000376"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:11.286017" elapsed="0.000046"/>
</return>
<msg time="2026-04-11T00:49:11.286220" 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-11T00:49:11.284336" elapsed="0.001912"/>
</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-11T00:49:11.286606" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:11.286428" elapsed="0.000237"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.286302" elapsed="0.000389"/>
</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-11T00:49:11.282090" elapsed="0.004655"/>
</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-11T00:49:11.286912" 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-11T00:49:11.287456" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:11.287298" elapsed="0.000225"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.287178" elapsed="0.000371"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-11T00:49:11.266948" elapsed="0.020657"/>
</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-11T00:49:11.290439" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:11.290304" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:11.290284" elapsed="0.000227"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.295103" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:11.294992" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:11.294973" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.296161" 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-11T00:49:11.295764" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.296767" 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-11T00:49:11.296432" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:11.296848" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:49:11.297007" 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-11T00:49:11.295415" elapsed="0.001617"/>
</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-11T00:49:11.297372" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.297635" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:11.297490" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:11.297473" elapsed="0.000255"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:11.297232" elapsed="0.000521"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.297084" elapsed="0.000695"/>
</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-11T00:49:11.294700" elapsed="0.003132"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-11T00:49:11.288202" elapsed="0.009685"/>
</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-11T00:49:11.287761" elapsed="0.010167"/>
</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-11T00:49:11.261563" elapsed="0.036415"/>
</kw>
<test id="s1-s2-t1" name="Check Shards Status Before Stop" line="16">
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:11.318674" elapsed="0.000227"/>
</kw>
<msg time="2026-04-11T00:49:11.318953" 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-11T00:49:11.318035" elapsed="0.000971"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default', 'entity-ownership'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:11.317579" elapsed="0.001502"/>
</kw>
<msg time="2026-04-11T00:49:11.319126" 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-11T00:49:11.309521" elapsed="0.009648"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:11.309115" elapsed="0.010127"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.319703" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:11.319448" elapsed="0.000299"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:11.324872" 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-11T00:49:11.324493" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.325345" 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-11T00:49:11.325060" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:11.325433" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:49:11.325588" 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-11T00:49:11.324102" elapsed="0.001510"/>
</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-11T00:49:11.325764" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.326422" level="INFO">${ds_type} = operational</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-11T00:49:11.326077" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.326846" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:11.326607" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.327307" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:11.327065" elapsed="0.000268"/>
</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-11T00:49:11.327742" elapsed="0.000035"/>
</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-11T00:49:11.328026" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:11.327880" 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-11T00:49:11.328248" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:11.328106" elapsed="0.000197"/>
</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-11T00:49:11.328492" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:11.328326" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:11.327861" elapsed="0.000707"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:11.327578" elapsed="0.001013"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.327393" elapsed="0.001223"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:11.328655" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:49:11.328853" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:11.328899" 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-11T00:49:11.323367" elapsed="0.005556"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.329363" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:11.329459" 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-11T00:49:11.329095" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.330043" 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-11T00:49:11.329766" elapsed="0.000350">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:11.329552" elapsed="0.000630">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:11.329535" elapsed="0.000679">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-11T00:49:11.330364" elapsed="0.000036"/>
</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-11T00:49:11.330554" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.330618" elapsed="0.000015"/>
</return>
<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>
<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-11T00:49:11.320721" elapsed="0.010001">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:11.320504" elapsed="0.010286">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:11.320352" elapsed="0.010490">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.319963" elapsed="0.010965">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.331155" elapsed="0.000023"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.298620" elapsed="0.032647">No leader found.</status>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.298040" elapsed="0.033372">No leader found.</status>
</test>
<test id="s1-s2-t2" name="Start Mininet Multiple Connections" line="20">
<kw name="Start Mininet Multiple Controllers" owner="MininetKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.339304" 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-11T00:49:11.338925" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.339821" 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-11T00:49:11.339507" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:11.339893" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:49:11.340095" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:11.338543" elapsed="0.001577"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.340529" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:11.340293" elapsed="0.000282"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.342979" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:11.342711" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:11.342692" elapsed="0.000369"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-11T00:49:11.343426" 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-11T00:49:11.343541" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-11T00:49:11.343215" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.344103" level="INFO">Attempting to execute command "sudo mn -c" on remote system "" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:11.343722" elapsed="0.000428"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-11T00:49:11.344700" level="INFO">${conn_id} = 3</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-11T00:49:11.344307" elapsed="0.000419"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.345695" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:11.345772" 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-11T00:49:11.345429" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T00:49:11.345953" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-11T00:49:11.347130" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-11T00:49:11.347466" 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-11T00:49:11.346808" elapsed="0.001171">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-11T00:49:11.348037" 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-11T00:49:11.346449" elapsed="0.001637"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.344957" elapsed="0.003233">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.348362" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.348552" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.348735" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.348861" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:11.348822" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:11.348802" elapsed="0.000129"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.349019" elapsed="0.000168"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:11.348984" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:11.348968" elapsed="0.000271"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.349272" elapsed="0.000014"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T00:49:11.351888" elapsed="0.000307"/>
</kw>
<kw name="Open 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-11T00:49:11.352357" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-11T00:49:11.352674" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-11T00:49:11.349634" elapsed="0.003195"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.342171" elapsed="0.010736">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-11T00:49:11.353006" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.341629" elapsed="0.011426"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.341126" elapsed="0.012027">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.353334" elapsed="0.000024"/>
</kw>
<arg>${mininet}</arg>
<status status="FAIL" start="2026-04-11T00:49:11.340775" elapsed="0.012688">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.357510" elapsed="0.000026"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.357722" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.357970" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:11.357807" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:11.357789" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="'${protocol}' == 'ssl'">
<kw name="Install Certificates In Mininet" owner="MininetKeywords">
<doc>Copy and install certificates in simulator.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.358300" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:11.358099" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:11.358083" elapsed="0.000293"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>Start mininet ${options}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.358545" elapsed="0.000021"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>sudo mn ${options}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.358708" elapsed="0.000021"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.358868" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Create controller configuration</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.359045" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${controller_opt}</var>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.359239" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<var>${controller_opt}</var>
<arg>${controller_opt}</arg>
<arg>${SPACE}${protocol}:${ODL_SYSTEM_${index}_IP}:${ofport}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.359532" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${controller_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.359712" elapsed="0.000030"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:11.359378" elapsed="0.000394"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.359305" elapsed="0.000493"/>
</for>
<kw name="Log" owner="BuiltIn">
<arg>Open extra SSH connection to configure the OVS bridges</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.359952" elapsed="0.000019"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.364000" elapsed="0.000026"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${num_bridges}</var>
<arg>sudo ovs-vsctl show | grep Bridge | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.364183" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${num_bridges}</var>
<arg>${num_bridges}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.364373" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${bridges}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.364570" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<var>${bridge}</var>
<arg>sudo ovs-vsctl show | grep Bridge | cut -c 12- | sort | head -${i} | tail -1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.364833" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo ovs-vsctl del-controller ${bridge} &amp;&amp; sudo ovs-vsctl set bridge ${bridge} protocols=OpenFlow${ofversion}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.364997" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${bridges}</arg>
<arg>${bridge}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.365153" elapsed="0.000020"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T00:49:11.364702" elapsed="0.000502"/>
</iter>
<var>${i}</var>
<value>1</value>
<value>${num_bridges+1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.364634" elapsed="0.000595"/>
</for>
<kw name="Log" owner="BuiltIn">
<arg>Configure OVS controllers ${controller_opt} in all bridges</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.365404" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo ovs-vsctl set-controller ${bridge} ${controller_opt}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.365640" elapsed="0.000019"/>
</kw>
<var name="${bridge}"/>
<status status="NOT RUN" start="2026-04-11T00:49:11.365515" elapsed="0.000228"/>
</iter>
<var>${bridge}</var>
<value>@{bridges}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.365468" elapsed="0.000302"/>
</for>
<kw name="Log" owner="BuiltIn">
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.365928" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${output}</var>
<arg>sudo ovs-vsctl show</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.366094" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.366270" elapsed="0.000020"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.366442" elapsed="0.000021"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.366499" elapsed="0.000015"/>
</return>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<arg>--topo tree,2</arg>
<doc>Start Mininet with custom topology and connect to list of controllers in ${controller_index_list} or all if no list is provided.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.336195" elapsed="0.030403">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.366772" elapsed="0.000021"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>OVSDB.Check OVS OpenFlow Connections</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>9</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.366943" elapsed="0.000021"/>
</kw>
<doc>Start mininet tree,2 with connection to all cluster instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.331600" elapsed="0.035512">OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t3" name="Check Entity Owner Status And Find Owner and Successor Before Stop" line="29">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.401564" 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-11T00:49:11.401150" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.402033" 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-11T00:49:11.401749" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:11.402103" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:49:11.402255" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:11.400780" elapsed="0.001499"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:11.407060" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:11.406873" elapsed="0.000213"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:11.407235" elapsed="0.000205"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:11.407798" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:11.407592" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.408242" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:11.407994" elapsed="0.000289"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:11.408445" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:11.408982" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:11.408776" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.409461" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:11.409170" elapsed="0.000341"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.410049" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:11.409689" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.410523" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:11.410259" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.410991" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:11.410712" elapsed="0.000304"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:11.417240" elapsed="0.000228"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:11.425868" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.426620" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:11.426232" elapsed="0.000415"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:11.427788" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.427219" elapsed="0.000716">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.428096" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.426831" elapsed="0.001380">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.428401" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.428575" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.428751" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.428927" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.429093" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.429257" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.429437" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.429609" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.429769" elapsed="0.000031"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.430047" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.430274" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.430492" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:11.429919" elapsed="0.000656"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.429848" elapsed="0.000756"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.430744" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.430803" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.425341" elapsed="0.005568">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.430977" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.415098" elapsed="0.015977">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.431248" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.435596" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.435830" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.435897" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.406310" elapsed="0.029698">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:11.436120" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:11.436164" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:11.405735" elapsed="0.030451"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.436414" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:11.436269" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:11.436250" elapsed="0.000232"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:11.437812" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.438499" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:11.438174" elapsed="0.000351"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:11.439319" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.439055" elapsed="0.000383">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.439504" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.438708" elapsed="0.000900">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.439777" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.439946" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.440117" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.440281" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.440472" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.440635" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.440795" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.440971" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.441132" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.441396" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.441576" elapsed="0.000028"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.441748" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:11.441258" elapsed="0.000543"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.441195" elapsed="0.000631"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.441964" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.442022" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.437223" elapsed="0.004903">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:11.442274" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:11.442318" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:11.436630" elapsed="0.005711"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:11.442969" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.442656" elapsed="0.000373">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:11.442442" elapsed="0.000650">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:11.442423" elapsed="0.000701">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.443169" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.405172" elapsed="0.038095">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.443459" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.443635" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.443698" elapsed="0.000023"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:11.402614" elapsed="0.041192">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.443979" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.444155" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.444323" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.444499" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.444665" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:11.444829" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:11.444890" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.400125" elapsed="0.044862">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:12.475976" 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-11T00:49:12.475502" elapsed="0.000505"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:12.476487" 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-11T00:49:12.476177" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:12.476561" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:49:12.476727" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:12.475092" elapsed="0.001659"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:12.481372" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:12.481183" elapsed="0.000230"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:12.481565" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:12.482116" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:12.481903" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:12.482607" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:12.482328" elapsed="0.000322"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:12.482796" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:12.483342" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:12.483136" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:12.483948" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:12.483704" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:12.484492" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:12.484138" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:12.484918" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:12.484680" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:12.485404" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:12.485107" elapsed="0.000324"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:12.491865" elapsed="0.000208"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:12.500377" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:12.501123" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:12.500748" elapsed="0.000400"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:12.502271" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:12.501745" elapsed="0.000694">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:12.502627" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:12.501331" elapsed="0.001414">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.502917" elapsed="0.000026"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.503094" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.503267" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.503452" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.503619" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.503780" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.503943" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.504118" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.504278" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.504558" elapsed="0.000053"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.504817" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.505006" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:12.504429" elapsed="0.000659"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:12.504346" elapsed="0.000771"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.505259" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:12.505320" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:12.499897" elapsed="0.005546">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:12.505522" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:12.489677" elapsed="0.015943">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.505793" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.509923" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.510114" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:12.510179" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:12.480646" elapsed="0.029640">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:12.510461" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:12.510515" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:12.480079" elapsed="0.030460"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:12.510742" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:12.510627" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:12.510606" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:12.512090" elapsed="0.000204"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:12.512761" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:12.512460" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:12.513597" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:12.513310" elapsed="0.000374">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:12.513746" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:12.512966" elapsed="0.000881">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.514014" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.514223" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.514448" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.514624" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.514786" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.514945" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.515104" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.515270" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.515447" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.515844" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.516018" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.516178" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:12.515584" elapsed="0.000648"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:12.515519" elapsed="0.000739"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.516408" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:12.516470" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:12.511559" elapsed="0.005015">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:12.516685" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:12.516729" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:12.510957" elapsed="0.005794"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:12.517353" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:12.517042" elapsed="0.000388">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:12.516831" elapsed="0.000662">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:12.516813" elapsed="0.000712">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:12.517571" elapsed="0.000022"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:12.479527" elapsed="0.038148">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.517847" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.518010" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:12.518072" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:12.477109" elapsed="0.041059">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.518407" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.518587" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.518753" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.518913" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.519077" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:12.519240" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:12.519301" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:12.474293" elapsed="0.045119">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:13.552473" 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-11T00:49:13.551986" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:13.552981" 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-11T00:49:13.552677" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:13.553056" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:49:13.553241" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:13.551603" elapsed="0.001663"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:13.557918" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:13.557730" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:13.558124" elapsed="0.000199"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:13.558710" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:13.558501" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:13.559209" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:13.558924" elapsed="0.000340"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:13.559430" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:13.559985" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:13.559773" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:13.560436" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:13.560179" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:13.562748" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:13.560630" elapsed="0.002146"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:13.563197" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:13.562948" elapsed="0.000294"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:13.563698" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:13.563408" elapsed="0.000317"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:13.569995" elapsed="0.000276"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:13.578648" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:13.579426" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:13.579021" elapsed="0.000441"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:13.580594" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:13.580051" elapsed="0.000694">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:13.580908" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:13.579657" elapsed="0.001370">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.581200" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.581372" elapsed="0.000036"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.581562" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.581757" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.581927" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.582089" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.582251" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.582438" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.582600" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.582865" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.583086" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.583278" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:13.582738" elapsed="0.000623"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:13.582668" elapsed="0.000753"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.583571" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:13.583630" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:13.578116" elapsed="0.005621">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:13.583805" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:13.567807" elapsed="0.016097">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.584076" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.588216" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.588498" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:13.588567" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:13.557148" elapsed="0.031524">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:13.588783" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:13.588827" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:13.556589" elapsed="0.032261"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:13.589052" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:13.588934" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:13.588914" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:13.590449" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:13.591114" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:13.590810" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:13.591948" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:13.591685" elapsed="0.000349">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:13.592096" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:13.591319" elapsed="0.000879">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.592365" elapsed="0.000043"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.592560" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.592733" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.592899" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.593061" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.593223" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.593398" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.593595" elapsed="0.000169"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.593915" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.594171" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.594342" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.594522" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:13.594044" elapsed="0.000532"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:13.593980" elapsed="0.000623"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.594743" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:13.594803" elapsed="0.000047"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:13.589897" elapsed="0.005047">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:13.595055" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:13.595099" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:13.589266" elapsed="0.005856"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:13.595750" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:13.595431" elapsed="0.000379">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:13.595203" elapsed="0.000670">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:13.595185" elapsed="0.000720">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:13.595950" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:13.556030" elapsed="0.040015">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.596253" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.596439" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:13.596502" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:13.553579" elapsed="0.043042">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.596837" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.597022" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.597191" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.597412" elapsed="0.000035"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.597610" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:13.597773" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:13.597834" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:13.550835" elapsed="0.047099">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:14.630106" 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-11T00:49:14.629666" elapsed="0.000471"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:14.630820" 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-11T00:49:14.630468" elapsed="0.000380"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:14.630897" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:49:14.631066" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:14.629269" elapsed="0.001821"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:14.636783" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:14.636510" elapsed="0.000311"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:14.637046" elapsed="0.000274"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:14.637866" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:14.637566" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:14.638537" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:14.638159" elapsed="0.000443"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:14.638817" elapsed="0.000255"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:14.639649" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:14.639315" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:14.640286" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:14.639935" elapsed="0.000415"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:14.641077" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:14.640596" elapsed="0.000520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:14.642000" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:14.641358" elapsed="0.000704"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:14.642704" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:14.642273" elapsed="0.000471"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:14.651948" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:14.665509" elapsed="0.000478"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:14.667279" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:14.666335" elapsed="0.001003"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:14.669912" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:14.668717" elapsed="0.001512">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:14.670617" elapsed="0.000046"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:14.667809" elapsed="0.003071">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.671292" elapsed="0.000049"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.671715" elapsed="0.000045"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.672105" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.672516" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.672884" elapsed="0.000044"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.673243" elapsed="0.000187"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.673769" elapsed="0.000045"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.674142" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.674534" elapsed="0.000045"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.675136" elapsed="0.000045"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.675661" elapsed="0.000047"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.676086" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:14.674835" elapsed="0.001425"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:14.674684" elapsed="0.001639"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.676700" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:14.676832" elapsed="0.000034"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:14.664335" elapsed="0.012736">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:14.677220" elapsed="0.000033"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:14.648750" elapsed="0.028719">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.677862" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.683249" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.683458" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:14.683524" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:14.635732" elapsed="0.047899">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:14.683750" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:14.683794" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:14.634900" elapsed="0.048917"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:14.684040" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:14.683907" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:14.683885" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:14.685470" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:14.686148" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:14.685835" elapsed="0.000339"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:14.686993" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:14.686725" elapsed="0.000398">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:14.687186" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:14.686358" elapsed="0.000932">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.687484" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.687661" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.687838" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.688009" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.688175" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.688338" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.688519" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.688691" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.688854" elapsed="0.000193"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.689293" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.689483" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.689649" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:14.689162" elapsed="0.000540"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:14.689096" elapsed="0.000633"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.689870" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:14.689930" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:14.684911" elapsed="0.005131">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:14.690154" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:14.690199" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:14.684258" elapsed="0.005964"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:14.690905" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:14.690536" elapsed="0.000430">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:14.690304" elapsed="0.000726">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:14.690285" elapsed="0.000777">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:14.691108" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:14.634178" elapsed="0.057028">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.691398" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.691607" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:14.691673" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:14.631417" elapsed="0.060358">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.691946" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.692127" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.692454" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.692621" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.692788" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:14.692954" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:14.693017" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:14.628540" elapsed="0.064578">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:15.724421" 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-11T00:49:15.723943" elapsed="0.000512"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:15.724918" 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-11T00:49:15.724622" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:15.724992" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:49:15.725158" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:15.723560" elapsed="0.001623"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:15.729748" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:15.729562" elapsed="0.000213"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:15.729924" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:15.730515" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:15.730261" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:15.730984" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:15.730731" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:15.731171" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:15.731720" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:15.731516" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:15.732335" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:15.731909" elapsed="0.000468"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:15.732960" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:15.732549" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:15.733407" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:15.733154" elapsed="0.000298"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:15.733889" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:15.733604" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:15.740218" elapsed="0.000229"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:15.748796" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:15.749558" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:15.749158" elapsed="0.000426"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:15.750721" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:15.750159" elapsed="0.000716">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:15.751036" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:15.749770" elapsed="0.001386">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.751328" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.751522" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.751696" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.751861" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.752023" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.752184" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.752344" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.752534" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.752694" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.752967" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.753195" elapsed="0.000025"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.753411" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:15.752838" elapsed="0.000658"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:15.752767" elapsed="0.000759"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.753669" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:15.753728" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:15.748294" elapsed="0.005539">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:15.753902" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:15.738036" elapsed="0.015964">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.754234" elapsed="0.000024"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.758443" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.758638" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:15.758705" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:15.729011" elapsed="0.029800">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:15.758921" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:15.758964" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:15.728458" elapsed="0.030529"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:15.759189" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:15.759074" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:15.759053" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:15.760561" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:15.761216" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:15.760916" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:15.762195" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:15.761771" elapsed="0.000513">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:15.762346" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:15.761438" elapsed="0.001051">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.762666" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.762837" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.763011" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.763179" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.763346" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.763527" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.763691" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.763860" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.764022" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.764274" elapsed="0.000026"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.764466" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.764628" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:15.764148" elapsed="0.000568"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:15.764085" elapsed="0.000658"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.764885" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:15.764945" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:15.760011" elapsed="0.005043">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:15.765165" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:15.765209" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:15.759422" elapsed="0.005809"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:15.765857" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:15.765542" elapsed="0.000374">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:15.765313" elapsed="0.000665">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:15.765295" elapsed="0.000739">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:15.766082" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:15.727901" elapsed="0.038279">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.766356" elapsed="0.000045"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.766548" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:15.766611" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:15.725495" elapsed="0.041213">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.766875" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.767051" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.767219" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.767400" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.767573" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:15.767736" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:15.767797" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:15.722796" elapsed="0.045098">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:16.801729" 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-11T00:49:16.801216" elapsed="0.000551"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:16.802245" 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-11T00:49:16.801944" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:16.802321" elapsed="0.000046"/>
</return>
<msg time="2026-04-11T00:49:16.802519" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:16.800827" elapsed="0.001717"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:16.807114" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:16.806922" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:16.807292" elapsed="0.000238"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:16.807891" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:16.807684" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:16.808572" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:16.808108" elapsed="0.000507"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:16.808765" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:16.809305" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:16.809099" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:16.809764" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:16.809518" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:16.810296" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:16.809956" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:16.810739" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:16.810503" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:16.811213" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:16.810932" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:16.817582" elapsed="0.000207"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:16.826295" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:16.827051" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:16.826674" elapsed="0.000404"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:16.828237" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:16.827706" elapsed="0.000703">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:16.828569" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:16.827282" elapsed="0.001409">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.828865" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.829036" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.829208" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.829375" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.829618" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.829783" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.829948" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.830116" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.830283" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.830566" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.830792" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.830982" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:16.830436" elapsed="0.000627"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:16.830352" elapsed="0.000762"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.831265" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:16.831325" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:16.825814" elapsed="0.005638">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:16.831521" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:16.815422" elapsed="0.016204">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.831800" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.836067" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.836260" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:16.836325" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:16.806365" elapsed="0.030122">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:16.836602" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:16.836645" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:16.805814" elapsed="0.030854"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:16.836877" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:16.836753" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:16.836732" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:16.838236" elapsed="0.000221"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:16.838953" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:16.838645" elapsed="0.000333"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:16.839793" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:16.839533" elapsed="0.000345">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:16.839940" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:16.839177" elapsed="0.000864">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.840212" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.840403" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.840581" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.840748" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.840913" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.841076" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.841238" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.841419" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.841582" elapsed="0.000031"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.841846" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.842019" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.842184" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:16.841721" elapsed="0.000515"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:16.841657" elapsed="0.000604"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.842413" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:16.842473" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:16.837701" elapsed="0.004874">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:16.842684" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:16.842727" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:16.837092" elapsed="0.005658"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:16.843408" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:16.843062" elapsed="0.000407">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:16.842830" elapsed="0.000701">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:16.842811" elapsed="0.000751">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:16.843607" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:16.805260" elapsed="0.038443">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.843913" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.844078" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:16.844141" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:16.802843" elapsed="0.041395">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.844420" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.844600" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.844767" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.844926" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.845088" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:16.845253" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:16.845314" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:16.800008" elapsed="0.045418">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:17.876500" 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-11T00:49:17.875989" elapsed="0.000548"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:17.877007" 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-11T00:49:17.876714" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:17.877081" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:49:17.877248" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:17.875594" elapsed="0.001679"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:17.882021" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:17.881817" elapsed="0.000236"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:17.882211" elapsed="0.000207"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:17.882784" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:17.882571" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:17.883251" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:17.882999" elapsed="0.000293"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:17.883452" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:17.883984" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:17.883781" elapsed="0.000227"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:17.884531" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:17.884264" elapsed="0.000309"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:17.885065" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:17.884723" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:17.885512" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:17.885260" elapsed="0.000296"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:17.885996" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:17.885714" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:17.892408" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:17.900862" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:17.901647" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:17.901226" elapsed="0.000448"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:17.902820" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:17.902261" elapsed="0.000720">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:17.903142" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:17.901859" elapsed="0.001401">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.903450" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.903629" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.903802" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.903967" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.904128" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.904288" elapsed="0.000024"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.904470" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.904640" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.904800" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.905089" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.905320" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.905541" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:17.904946" elapsed="0.000680"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:17.904868" elapsed="0.000795"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.905804" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:17.905863" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:17.900364" elapsed="0.005605">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:17.906037" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:17.890232" elapsed="0.015947">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.906354" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.910465" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.910656" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:17.910721" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:17.881234" elapsed="0.029593">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:17.910937" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:17.910980" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:17.880687" elapsed="0.030316"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:17.911203" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:17.911090" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:17.911069" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:17.912596" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:17.913257" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:17.912955" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:17.914115" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:17.913841" elapsed="0.000366">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:17.914267" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:17.913496" elapsed="0.000873">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.914570" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.914739" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.914911" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.915088" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.915250" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.915423" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.915587" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.915752" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.915916" elapsed="0.000055"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.916345" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.916533" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.916695" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:17.916214" elapsed="0.000534"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:17.916019" elapsed="0.000755"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.916912" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:17.916971" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:17.912043" elapsed="0.005037">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:17.917191" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:17.917234" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:17.911460" elapsed="0.005797"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:17.917910" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:17.917587" elapsed="0.000383">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:17.917336" elapsed="0.000695">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:17.917318" elapsed="0.000745">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:17.918108" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:17.880125" elapsed="0.038079">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.918377" elapsed="0.000042"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.918563" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:17.918630" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:17.877586" elapsed="0.041141">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.918897" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.919088" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.919282" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.919457" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.919624" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:17.919785" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:17.919845" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:17.874731" elapsed="0.045244">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:18.950778" 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-11T00:49:18.950291" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:18.951290" 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-11T00:49:18.950986" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:18.951366" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:49:18.951555" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:18.949902" elapsed="0.001678"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:18.956285" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:18.956096" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:18.956475" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:18.957023" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:18.956816" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:18.957526" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:18.957249" elapsed="0.000319"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:18.957712" elapsed="0.000176"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:18.958236" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:18.958035" elapsed="0.000226"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:18.958679" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:18.958438" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:18.959402" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:18.958876" elapsed="0.000554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:18.959832" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:18.959596" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:18.960309" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:18.960030" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:18.966585" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:18.975035" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:18.975794" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:18.975415" elapsed="0.000405"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:18.976967" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:18.976428" elapsed="0.000722">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:18.977316" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:18.976005" elapsed="0.001449">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.977636" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.977877" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.978053" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.978221" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.978400" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.978568" elapsed="0.000031"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.978745" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.978913" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.979072" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.979338" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.979578" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.979768" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:18.979210" elapsed="0.000639"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:18.979140" elapsed="0.000738"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.980028" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:18.980086" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:18.974554" elapsed="0.005638">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:18.980259" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:18.964410" elapsed="0.015951">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.980552" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.984644" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.984837" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:18.984902" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:18.955555" elapsed="0.029465">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:18.985137" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:18.985180" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:18.954936" elapsed="0.030267"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:18.985500" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:18.985323" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:18.985302" elapsed="0.000266"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:18.986853" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:18.987534" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:18.987218" elapsed="0.000342"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:18.988353" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:18.988086" elapsed="0.000370">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:18.988519" elapsed="0.001914"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:18.987739" elapsed="0.002794">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.990709" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.990883" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.991058" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.991227" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.991407" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.991573" elapsed="0.000027"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.991744" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.991914" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.992075" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.992334" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.992523" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.992685" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:18.992208" elapsed="0.000530"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:18.992144" elapsed="0.000620"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.992902" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:18.992971" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:18.986301" elapsed="0.006774">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:18.993187" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:18.993231" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:18.985717" elapsed="0.007538"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:18.993882" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:18.993567" elapsed="0.000375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:18.993334" elapsed="0.000670">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:18.993316" elapsed="0.000757">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:18.994121" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:18.954344" elapsed="0.039874">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.994407" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.994575" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:18.994637" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:18.951884" elapsed="0.042849">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.994898" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.995074" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.995241" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.995417" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.995586" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:18.995749" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:18.995810" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:18.948933" elapsed="0.046974">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:20.026632" 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-11T00:49:20.026136" elapsed="0.000531"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:20.027134" 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-11T00:49:20.026838" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:20.027209" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:49:20.027378" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:20.025727" elapsed="0.001691"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:20.031980" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:20.031794" elapsed="0.000213"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:20.032157" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:20.032721" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:20.032513" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:20.033262" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:20.033008" elapsed="0.000296"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:20.033465" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:20.034020" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:20.033796" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:20.078609" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:20.034216" elapsed="0.044457"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:20.079259" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:20.078883" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:20.079726" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:20.079485" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:20.080210" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:20.079922" elapsed="0.000315"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:20.086661" elapsed="0.000218"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:20.095204" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:20.095980" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:20.095583" elapsed="0.000424"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:20.097153" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:20.096619" elapsed="0.000687">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:20.097498" elapsed="0.000024"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:20.096193" elapsed="0.001435">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.097804" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.097976" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.098149" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.098316" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.098496" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.098661" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.098822" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.098989" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.099155" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.099436" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.099662" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.099853" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:20.099291" elapsed="0.000642"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:20.099222" elapsed="0.000740"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.100104" elapsed="0.000082"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:20.100228" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:20.094715" elapsed="0.005622">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:20.100422" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:20.084415" elapsed="0.016111">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.100705" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.104977" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.105175" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:20.105243" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:20.031244" elapsed="0.074117">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:20.105545" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:20.105591" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:20.030677" elapsed="0.074938"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:20.105837" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:20.105704" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:20.105682" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:20.107199" elapsed="0.000222"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:20.107878" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:20.107575" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:20.108697" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:20.108432" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:20.108844" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:20.108081" elapsed="0.000865">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.109118" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.109288" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.109504" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.109675" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.109879" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.110046" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.110212" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.110396" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.110561" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.110815" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.110985" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.111144" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:20.110688" elapsed="0.000509"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:20.110625" elapsed="0.000597"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.111360" elapsed="0.000034"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:20.111435" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:20.106661" elapsed="0.004879">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:20.111649" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:20.111692" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:20.106054" elapsed="0.005660"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:20.112322" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:20.112006" elapsed="0.000390">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:20.111794" elapsed="0.000666">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:20.111776" elapsed="0.000717">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:20.112537" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:20.030117" elapsed="0.082516">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.112808" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.112972" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:20.113034" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:20.027718" elapsed="0.085414">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.113335" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.113539" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.113708" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.113907" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.114075" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:20.114239" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:20.114300" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:20.024867" elapsed="0.089549">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:21.146668" 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-11T00:49:21.146178" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:21.147245" 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-11T00:49:21.146875" elapsed="0.000406"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:21.147332" elapsed="0.000064"/>
</return>
<msg time="2026-04-11T00:49:21.147534" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:21.145768" elapsed="0.001791"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:21.152137" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:21.151945" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:21.152314" elapsed="0.000207"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:21.152885" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:21.152676" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:21.153357" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:21.153100" elapsed="0.000314"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:21.153562" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:21.154102" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:21.153896" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:21.154562" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:21.154300" elapsed="0.000304"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:21.155090" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:21.154754" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:21.155571" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:21.155314" elapsed="0.000301"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:21.156042" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:21.155765" elapsed="0.000303"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:21.165089" elapsed="0.000317"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:21.174558" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:21.175329" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:21.174919" elapsed="0.000436"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:21.176595" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:21.176037" elapsed="0.000709">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:21.176908" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:21.175640" elapsed="0.001393">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.177206" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.177397" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.177575" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.177743" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.177907" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.178069" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.178237" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.178427" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.178591" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.178863" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.179111" elapsed="0.000026"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.179311" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:21.178733" elapsed="0.000677"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:21.178660" elapsed="0.000781"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.179584" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:21.179644" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:21.174056" elapsed="0.005695">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:21.179820" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:21.162018" elapsed="0.017901">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.180094" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.184210" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.184463" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:21.184566" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:21.151409" elapsed="0.033265">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:21.184788" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:21.184831" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:21.150823" elapsed="0.034031"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:21.185073" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:21.184943" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:21.184922" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:21.186460" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:21.187134" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:21.186820" elapsed="0.000339"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:21.187954" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:21.187692" elapsed="0.000349">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:21.188103" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:21.187339" elapsed="0.000865">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.188373" elapsed="0.000036"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.188560" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.188732" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.188898" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.189061" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.189227" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.189403" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.189572" elapsed="0.000156"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.189875" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.190130" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.190300" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.190477" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:21.190003" elapsed="0.000528"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:21.189939" elapsed="0.000618"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.190695" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:21.190754" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:21.185898" elapsed="0.004960">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:21.190993" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:21.191074" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:21.185289" elapsed="0.005809"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:21.191725" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:21.191409" elapsed="0.000376">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:21.191180" elapsed="0.000667">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:21.191161" elapsed="0.000718">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:21.191924" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:21.150259" elapsed="0.041762">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.192201" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.192369" elapsed="0.000035"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:21.192448" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:21.147862" elapsed="0.044686">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.192716" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.192894" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.193063" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.193224" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.193402" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:21.193567" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:21.193628" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:21.144915" elapsed="0.048810">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:22.225053" 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-11T00:49:22.224571" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:22.225590" 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-11T00:49:22.225264" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:22.225667" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:49:22.225840" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:22.224157" elapsed="0.001708"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:22.230530" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:22.230324" elapsed="0.000232"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:22.230708" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:22.231257" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:22.231051" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:22.231737" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:22.231482" elapsed="0.000297"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:22.231926" elapsed="0.000177"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:22.232651" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:22.232258" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:22.233090" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:22.232847" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:22.233650" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:22.233282" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:22.234075" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:22.233842" elapsed="0.000277"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:22.234568" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:22.234266" elapsed="0.000329"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:22.240833" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:22.249329" elapsed="0.000235"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:22.250106" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:22.249723" elapsed="0.000410"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:22.251261" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:22.250736" elapsed="0.000696">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:22.251593" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:22.250317" elapsed="0.001397">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.251885" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.252057" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.252232" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.252416" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.252582" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.252745" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.252908" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.253073" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.253232" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.253537" elapsed="0.000066"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.253812" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.254002" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:22.253406" elapsed="0.000677"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:22.253300" elapsed="0.000812"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.254252" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:22.254310" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:22.248840" elapsed="0.005594">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:22.254504" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:22.238666" elapsed="0.015938">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.254779" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.259009" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.259205" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:22.259271" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:22.229786" elapsed="0.029592">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:22.259550" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:22.259593" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:22.229200" elapsed="0.030416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:22.259822" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:22.259703" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:22.259681" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:22.261177" elapsed="0.000247"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:22.261879" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:22.261578" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:22.262702" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:22.262440" elapsed="0.000348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:22.262848" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:22.262084" elapsed="0.000865">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.263120" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.263324" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.263527" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.263696" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.263861" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.264022" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.264187" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.264359" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.264537" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.264790" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.264959" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.265118" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:22.264664" elapsed="0.000506"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:22.264601" elapsed="0.000594"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.265357" elapsed="0.000039"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:22.265437" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:22.260637" elapsed="0.004906">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:22.265653" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:22.265698" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:22.260037" elapsed="0.005684"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:22.266327" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:22.266012" elapsed="0.000391">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:22.265801" elapsed="0.000666">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:22.265783" elapsed="0.000716">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:22.266544" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:22.228650" elapsed="0.037989">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.266812" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.266976" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:22.267037" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:22.226258" elapsed="0.040875">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.267333" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.267537" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.267704" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.267862" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.268026" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:22.268187" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:22.268248" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:22.223370" elapsed="0.044975">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:23.301254" 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-11T00:49:23.300773" elapsed="0.000515"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:23.302039" 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-11T00:49:23.301702" elapsed="0.000371"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:23.302125" elapsed="0.000045"/>
</return>
<msg time="2026-04-11T00:49:23.302305" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:23.300341" elapsed="0.001988"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:23.307427" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:23.307202" elapsed="0.000259"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:23.307634" elapsed="0.000219"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:23.308284" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:23.308041" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:23.308876" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:23.308564" elapsed="0.000357"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:23.309089" elapsed="0.000186"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:23.309655" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:23.309442" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:23.310190" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:23.309893" elapsed="0.000342"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:23.310838" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:23.310441" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:23.311314" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:23.311052" elapsed="0.000309"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:23.311949" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:23.311610" elapsed="0.000373"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:23.318602" elapsed="0.000293"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:23.327309" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:23.328081" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:23.327694" elapsed="0.000413"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:23.329276" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:23.328738" elapsed="0.000709">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:23.329611" elapsed="0.000023"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:23.328294" elapsed="0.001446">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.329915" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.330089" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.330268" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.330452" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.330618" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.330781" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.330943" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.331110" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.331270" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.331564" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.331787" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.331977" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:23.331432" elapsed="0.000625"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:23.331343" elapsed="0.000744"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.332230" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:23.332289" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:23.326822" elapsed="0.005590">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:23.332498" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:23.316407" elapsed="0.016194">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.332775" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.337077" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.337311" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:23.337379" elapsed="0.000107"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:23.306606" elapsed="0.030978">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:23.337699" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:23.337743" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:23.305959" elapsed="0.031807"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:23.337993" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:23.337858" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:23.337836" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:23.339365" elapsed="0.000262"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:23.340086" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:23.339783" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:23.340929" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:23.340665" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:23.341077" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:23.340291" elapsed="0.000925">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.341414" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.341611" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.341785" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.341952" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.342115" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.342276" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.342452" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.342621" elapsed="0.000157"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.342927" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.343183" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.343354" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.343531" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:23.343056" elapsed="0.000528"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:23.342991" elapsed="0.000619"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.343747" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:23.343805" elapsed="0.000048"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:23.338830" elapsed="0.005118">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:23.344059" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:23.344103" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:23.338220" elapsed="0.005905"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:23.344765" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:23.344443" elapsed="0.000382">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:23.344205" elapsed="0.000684">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:23.344187" elapsed="0.000735">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:23.344967" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:23.305339" elapsed="0.039725">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.345239" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.345417" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:23.345480" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:23.302647" elapsed="0.042930">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.345746" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.345923" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.346110" elapsed="0.000026"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.346289" elapsed="0.000022"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.346504" elapsed="0.000027"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:23.346709" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:23.346784" elapsed="0.000019"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:23.299545" elapsed="0.047360">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:24.378784" 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-11T00:49:24.378276" elapsed="0.000545"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:24.379396" 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-11T00:49:24.379079" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:24.379475" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:49:24.379651" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:24.377870" elapsed="0.001806"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:24.384279" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:24.384071" elapsed="0.000236"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:24.384476" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:24.385030" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:24.384823" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:24.385513" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:24.385241" elapsed="0.000314"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:24.385700" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:24.386439" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:24.386030" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:24.386883" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:24.386637" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:24.387432" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:24.387076" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:24.387860" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:24.387624" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:24.388367" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:24.388053" elapsed="0.000358"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:24.394901" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:24.403428" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:24.404206" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:24.403793" elapsed="0.000444"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:24.405404" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:24.404853" elapsed="0.000709">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:24.405725" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:24.404459" elapsed="0.001391">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.406026" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.406198" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.406370" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.406556" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.406719" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.406881" elapsed="0.000066"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.407097" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.407266" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.407443" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.407718" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.407941" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.408141" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:24.407588" elapsed="0.000639"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:24.407515" elapsed="0.000741"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.408416" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:24.408478" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:24.402927" elapsed="0.005659">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:24.408655" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:24.392717" elapsed="0.016036">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.408929" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.413188" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.413437" elapsed="0.000024"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:24.413508" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:24.383533" elapsed="0.030084">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:24.413730" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:24.413773" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:24.382958" elapsed="0.030838"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:24.414015" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:24.413884" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:24.413863" elapsed="0.000219"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:24.415412" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:24.416081" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:24.415775" elapsed="0.000344"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:24.416920" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:24.416655" elapsed="0.000401">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:24.417119" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:24.416301" elapsed="0.000923">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.417418" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.417595" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.417767" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.417934" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.418098" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.418259" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.418435" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.418606" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.418769" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.419024" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.419192" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.419351" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:24.418899" elapsed="0.000520"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:24.418834" elapsed="0.000612"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.419586" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:24.419645" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:24.414860" elapsed="0.004889">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:24.419860" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:24.419903" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:24.414233" elapsed="0.005693"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:24.420570" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:24.420233" elapsed="0.000398">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:24.420006" elapsed="0.000688">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:24.419987" elapsed="0.000739">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:24.420770" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:24.382409" elapsed="0.038458">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.421041" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.421246" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:24.421310" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:24.379975" elapsed="0.041450">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.421596" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.421781" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.421948" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.422106" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.422272" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:24.422448" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:24.422511" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:24.376981" elapsed="0.045629">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:25.453745" 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-11T00:49:25.453222" elapsed="0.000559"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:25.454246" 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-11T00:49:25.453951" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:25.454320" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:49:25.454512" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:25.452830" elapsed="0.001707"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:25.459158" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:25.458971" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:25.459334" elapsed="0.000205"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:25.459899" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:25.459692" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:25.460361" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:25.460108" elapsed="0.000338"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:25.460612" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:25.461154" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:25.460951" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:25.461608" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:25.461345" elapsed="0.000305"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:25.462225" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:25.461800" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:25.462671" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:25.462433" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:25.463144" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:25.462863" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:25.469725" elapsed="0.000222"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:25.478453" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:25.479203" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:25.478820" elapsed="0.000408"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:25.480462" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:25.479863" elapsed="0.000764">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:25.480824" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:25.479442" elapsed="0.001506">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.481123" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.481301" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.481495" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.481663" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.481827" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.481988" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.482152" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.482351" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.482539" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.482813" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.483039" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.483231" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:25.482684" elapsed="0.000629"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:25.482611" elapsed="0.000732"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.483501" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:25.483563" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:25.477941" elapsed="0.005730">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:25.483741" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:25.467466" elapsed="0.016375">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.484056" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.488462" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.488698" elapsed="0.000027"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:25.488782" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:25.458438" elapsed="0.030454">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:25.489008" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:25.489051" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:25.457871" elapsed="0.031211"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:25.489350" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:25.489198" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:25.489170" elapsed="0.000288"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:25.491055" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:25.491817" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:25.491454" elapsed="0.000393"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:25.492952" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:25.492618" elapsed="0.000443">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:25.493124" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:25.492089" elapsed="0.001138">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.493418" elapsed="0.000025"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.493595" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.493772" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.493962" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.494150" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.494318" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.494500" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.494672" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.494834" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.495105" elapsed="0.000029"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.495306" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.495488" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:25.494966" elapsed="0.000618"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:25.494899" elapsed="0.000722"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.495767" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:25.495828" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:25.490462" elapsed="0.005476">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:25.496065" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:25.496109" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:25.489653" elapsed="0.006479"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:25.497073" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:25.496471" elapsed="0.000675">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:25.496216" elapsed="0.001007">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:25.496197" elapsed="0.001067">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:25.497323" elapsed="0.000020"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:25.457306" elapsed="0.040164">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.497708" elapsed="0.000029"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.497900" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:25.497968" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:25.454831" elapsed="0.043245">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.498261" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.498512" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.498738" elapsed="0.000026"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.498960" elapsed="0.000027"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.499169" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:25.499341" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:25.499422" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:25.451938" elapsed="0.047587">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:26.530454" 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-11T00:49:26.529962" elapsed="0.000527"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:26.530954" 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-11T00:49:26.530659" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:26.531029" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:49:26.531200" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:26.529574" elapsed="0.001651"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:26.535823" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:26.535631" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:26.536001" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:26.536566" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:26.536342" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:26.537040" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:26.536778" elapsed="0.000313"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:26.537241" elapsed="0.000197"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:26.537794" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:26.537589" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:26.538232" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:26.537985" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:26.538781" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:26.538439" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:26.539204" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:26.538971" elapsed="0.000276"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:26.539692" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:26.539410" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:26.546149" elapsed="0.000208"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:26.554665" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:26.555440" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:26.555029" elapsed="0.000439"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:26.556602" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:26.556053" elapsed="0.000707">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:26.556920" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:26.555660" elapsed="0.001411">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.557246" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.557435" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.557614" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.557782" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.558012" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.558176" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.558340" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.558526" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.558688" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.558966" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.559192" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.559401" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:26.558834" elapsed="0.000650"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:26.558761" elapsed="0.000758"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.559665" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:26.559725" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:26.554163" elapsed="0.005669">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:26.559901" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:26.543962" elapsed="0.016038">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.560172" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.564290" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.564534" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:26.564602" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:26.535073" elapsed="0.029633">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:26.564818" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:26.564861" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:26.534523" elapsed="0.030361"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:26.565104" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:26.564982" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:26.564961" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:26.566487" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:26.567183" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:26.566881" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:26.568009" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:26.567747" elapsed="0.000348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:26.568157" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:26.567404" elapsed="0.000856">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.568456" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.568628" elapsed="0.000019"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.568799" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.569000" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.569174" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.569339" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.569522" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.569693" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.569854" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.570113" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.570284" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.570458" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:26.569986" elapsed="0.000527"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:26.569923" elapsed="0.000615"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.570674" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:26.570732" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:26.565933" elapsed="0.004903">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:26.570946" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:26.570989" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:26.565319" elapsed="0.005693"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:26.571810" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:26.571491" elapsed="0.000379">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:26.571257" elapsed="0.000675">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:26.571074" elapsed="0.000890">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:26.572009" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:26.533951" elapsed="0.038154">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.572319" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.572504" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:26.572567" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:26.531544" elapsed="0.041121">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.572830" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.573020" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.573188" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.573352" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.573536" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:26.573699" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:26.573760" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:26.528757" elapsed="0.045099">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:27.604857" 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-11T00:49:27.604351" elapsed="0.000541"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:27.605364" 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-11T00:49:27.605066" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:27.605456" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:49:27.605633" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:27.603958" elapsed="0.001699"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:27.610217" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:27.610004" elapsed="0.000240"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:27.610410" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:27.610960" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:27.610753" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:27.611440" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:27.611172" elapsed="0.000310"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:27.611627" elapsed="0.000177"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:27.612158" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:27.611955" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:27.612682" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:27.612432" elapsed="0.000293"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:27.613221" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:27.612878" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:27.613665" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:27.613428" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:27.614170" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:27.613860" elapsed="0.000336"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:27.620701" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:27.629637" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:27.630421" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:27.630012" elapsed="0.000436"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:27.631580" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:27.631031" elapsed="0.000707">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:27.631898" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:27.630639" elapsed="0.001383">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.632197" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.632369" elapsed="0.000040"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.632568" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.632737" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.632900" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.633063" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.633226" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.633405" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.633569" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.633840" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.634075" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.634268" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:27.633712" elapsed="0.000637"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:27.633639" elapsed="0.000759"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.634544" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:27.634603" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:27.629132" elapsed="0.005578">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:27.634778" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:27.618531" elapsed="0.016388">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.635095" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.639274" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.639482" elapsed="0.000029"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:27.639556" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:27.609471" elapsed="0.030191">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:27.639779" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:27.639822" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:27.608903" elapsed="0.030942"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:27.640053" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:27.639935" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:27.639913" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:27.641435" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:27.642124" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:27.641796" elapsed="0.000353"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:27.642945" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:27.642684" elapsed="0.000347">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:27.643092" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:27.642330" elapsed="0.000865">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.643365" elapsed="0.000036"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.643553" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.643725" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.643892" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.644054" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.644213" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.644374" elapsed="0.000034"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.644582" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.644765" elapsed="0.000055"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.645197" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.645371" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.645551" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:27.644930" elapsed="0.000673"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:27.644867" elapsed="0.000762"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.645768" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:27.645826" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:27.640881" elapsed="0.005066">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:27.646060" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:27.646103" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:27.640271" elapsed="0.005855"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:27.646747" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:27.646433" elapsed="0.000375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:27.646205" elapsed="0.000666">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:27.646187" elapsed="0.000716">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:27.646948" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:27.608347" elapsed="0.038699">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.647219" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.647401" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:27.647466" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:27.605955" elapsed="0.041607">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.647725" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.647899" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.648066" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.648225" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.648400" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:27.648566" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:27.648626" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:27.603136" elapsed="0.045621">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:28.679746" 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-11T00:49:28.679251" elapsed="0.000529"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:28.680248" 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-11T00:49:28.679953" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:28.680323" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:49:28.680512" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:28.678861" elapsed="0.001676"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:28.685196" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:28.685001" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:28.685394" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:28.685949" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:28.685740" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:28.686490" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:28.686160" elapsed="0.000372"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:28.686700" elapsed="0.000213"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:28.687287" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:28.687081" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:28.687753" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:28.687509" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:28.688482" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:28.687946" elapsed="0.000563"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:28.688915" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:28.688676" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:28.689405" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:28.689108" elapsed="0.000325"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:28.695764" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:28.704286" elapsed="0.000229"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:28.705112" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:28.704709" elapsed="0.000430"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:28.706270" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:28.705744" elapsed="0.000695">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:28.706603" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:28.705324" elapsed="0.001399">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.706898" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.707133" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.707331" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.707523" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.707689" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.707851" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.708015" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.708184" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.708345" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.708633" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.708858" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.709050" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:28.708503" elapsed="0.000628"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:28.708431" elapsed="0.000729"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.709305" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:28.709366" elapsed="0.000028"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:28.703799" elapsed="0.005690">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:28.709557" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:28.693577" elapsed="0.016077">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.709829" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.713942" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.714134" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:28.714199" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:28.684463" elapsed="0.029845">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:28.714477" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:28.714522" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:28.683888" elapsed="0.030657"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:28.714794" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:28.714669" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:28.714647" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:28.716164" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:28.716840" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:28.716540" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:28.717663" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:28.717399" elapsed="0.000487">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:28.717950" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:28.717045" elapsed="0.001009">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.718225" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.718421" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.718599" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.718767" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.718933" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.719094" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.719256" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.719465" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.719630" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.719882" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.720051" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.720211" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:28.719757" elapsed="0.000505"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:28.719693" elapsed="0.000595"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.720441" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:28.720501" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:28.715626" elapsed="0.004979">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:28.720714" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:28.720757" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:28.715012" elapsed="0.005768"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:28.721399" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:28.721067" elapsed="0.000394">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:28.720858" elapsed="0.000666">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:28.720840" elapsed="0.000749">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:28.721638" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:28.683280" elapsed="0.038457">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.721911" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.722075" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:28.722137" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:28.680834" elapsed="0.041400">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.722415" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.722593" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.722760" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.722923" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.723089" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:28.723252" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:28.723330" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:28.678056" elapsed="0.045390">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:29.757068" 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-11T00:49:29.756550" elapsed="0.000554"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:29.757599" 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-11T00:49:29.757277" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:29.757675" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:49:29.757848" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:29.756143" elapsed="0.001729"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:29.762441" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:29.762237" elapsed="0.000232"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:29.762621" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:29.763350" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:29.762961" elapsed="0.000499"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:29.763912" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:29.763652" elapsed="0.000302"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:29.764101" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:29.764658" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:29.764450" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:29.765119" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:29.764849" elapsed="0.000312"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:29.765676" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:29.765317" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:29.766103" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:29.765868" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:29.766594" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:29.766295" elapsed="0.000325"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:29.772886" elapsed="0.000223"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:29.781578" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:29.782348" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:29.781955" elapsed="0.000420"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:29.783539" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:29.782986" elapsed="0.000704">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:29.783855" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:29.782594" elapsed="0.001384">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.784155" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.784330" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.784525" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.784696" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.784862" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.785059" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.785225" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.785408" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.785573" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.785841" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.786062" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.786251" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:29.785714" elapsed="0.000616"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:29.785643" elapsed="0.000715"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.786515" elapsed="0.000075"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:29.786632" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:29.781045" elapsed="0.005695">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:29.786807" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:29.770729" elapsed="0.016177">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.787079" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.791324" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.791608" elapsed="0.000026"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:29.791684" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:29.761698" elapsed="0.030099">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:29.791921" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:29.791967" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:29.761116" elapsed="0.030876"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:29.792225" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:29.792087" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:29.792063" elapsed="0.000233"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:29.793652" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:29.794313" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:29.794011" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:29.795128" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:29.794866" elapsed="0.000348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:29.795276" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:29.794533" elapsed="0.000873">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.795580" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.795749" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.795919" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.796085" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.796288" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.796468" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.796635" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.796803" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.796979" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.797237" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.797423" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.797585" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:29.797110" elapsed="0.000527"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:29.797046" elapsed="0.000617"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.797802" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:29.797860" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:29.793097" elapsed="0.004867">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:29.798075" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:29.798119" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:29.792473" elapsed="0.005669"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:29.798771" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:29.798450" elapsed="0.000381">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:29.798222" elapsed="0.000672">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:29.798205" elapsed="0.000721">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:29.798970" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:29.760554" elapsed="0.038514">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.799242" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.799422" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:29.799484" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:29.758168" elapsed="0.041415">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.799751" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.799927" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.800093" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.800290" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.800473" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:29.800639" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:29.800700" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:29.755347" elapsed="0.045452">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:30.831614" 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-11T00:49:30.831126" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:30.832118" 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-11T00:49:30.831821" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:30.832193" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:49:30.832363" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:30.830716" elapsed="0.001687"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:30.836999" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:30.836804" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:30.837180" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:30.837751" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:30.837540" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:30.838213" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:30.837959" elapsed="0.000296"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:30.838416" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:30.838975" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:30.838751" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:30.839429" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:30.839170" elapsed="0.000301"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:30.839963" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:30.839623" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:30.840413" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:30.840159" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:30.840887" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:30.840607" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:30.848813" elapsed="0.000214"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:30.857445" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:30.858204" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:30.857811" elapsed="0.000419"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:30.859472" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:30.858923" elapsed="0.000700">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:30.859783" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:30.858500" elapsed="0.001399">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.860073" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.860242" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.860430" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.860598" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.860762" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.860924" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.861087" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.861255" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.861431" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.861711" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.861936" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.862127" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:30.861573" elapsed="0.000636"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:30.861499" elapsed="0.000738"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.862376" elapsed="0.000036"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:30.862451" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:30.856939" elapsed="0.005619">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:30.862628" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:30.846591" elapsed="0.016136">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.862913" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.867016" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.867207" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:30.867308" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:30.836249" elapsed="0.031240">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:30.867603" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:30.867646" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:30.835689" elapsed="0.031980"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:30.867868" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:30.867753" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:30.867732" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:30.869215" elapsed="0.000222"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:30.869892" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:30.869590" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:30.870707" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:30.870445" elapsed="0.000368">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:30.870877" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:30.870095" elapsed="0.000884">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.871148" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.871318" elapsed="0.000019"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.871515" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.871684" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.871847" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.872007" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.872170" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.872337" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.872516" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.872767" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.872935" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.873094" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:30.872642" elapsed="0.000503"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:30.872580" elapsed="0.000591"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.873306" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:30.873363" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:30.868681" elapsed="0.004802">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:30.873594" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:30.873682" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:30.868081" elapsed="0.005626"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:30.874491" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:30.873997" elapsed="0.000555">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:30.873788" elapsed="0.000828">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:30.873769" elapsed="0.000879">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:30.874694" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:30.835116" elapsed="0.039684">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.874979" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.875146" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:30.875208" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:30.832702" elapsed="0.042604">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.875490" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.875669" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.875838" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.875999" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.876162" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:30.876323" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:30.876397" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:30.829722" elapsed="0.046776">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:31.907148" 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-11T00:49:31.906692" elapsed="0.000490"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:31.907666" 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-11T00:49:31.907353" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:31.907740" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:49:31.907910" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:31.906288" elapsed="0.001647"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:31.912609" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:31.912418" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:31.912786" elapsed="0.000204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:31.913418" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:31.913172" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:31.913894" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:31.913637" elapsed="0.000299"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:31.914083" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:31.914636" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:31.914430" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:31.915072" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:31.914830" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:31.915614" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:31.915262" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:31.916039" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:31.915805" elapsed="0.000278"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:31.916527" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:31.916230" elapsed="0.000323"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:31.922990" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:31.931619" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:31.932368" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:31.931984" elapsed="0.000432"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:31.933576" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:31.933026" elapsed="0.000706">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:31.933889" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:31.932607" elapsed="0.001405">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.934185" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.934357" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.934549" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.934718" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.934881" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.935043" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.935206" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.935373" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.935551" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.935820" elapsed="0.000062"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.936089" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.936282" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:31.935692" elapsed="0.000671"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:31.935621" elapsed="0.000786"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.936552" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:31.936612" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:31.931111" elapsed="0.005608">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:31.936787" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:31.920817" elapsed="0.016080">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.937074" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.941211" elapsed="0.000032"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.941471" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:31.941539" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:31.911865" elapsed="0.029781">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:31.941757" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:31.941800" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:31.911293" elapsed="0.030530"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:31.942034" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:31.941912" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:31.941890" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:31.943411" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:31.944073" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:31.943771" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:31.944903" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:31.944630" elapsed="0.000363">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:31.945055" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:31.944279" elapsed="0.000880">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.945330" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.945571" elapsed="0.000024"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.945755" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.945924" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.946089" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.946251" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.946447" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.946619" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.946786" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.947039" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.947209" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.947369" elapsed="0.000038"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:31.946914" elapsed="0.000526"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:31.946851" elapsed="0.000615"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.947603" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:31.947661" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:31.942861" elapsed="0.004904">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:31.947876" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:31.947920" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:31.942246" elapsed="0.005696"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:31.948748" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:31.948235" elapsed="0.000573">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:31.948022" elapsed="0.000862">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:31.948004" elapsed="0.000913">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:31.948965" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:31.910743" elapsed="0.038319">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.949235" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.949416" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:31.949480" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:31.908329" elapsed="0.041249">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.949780" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.949958" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.950126" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.950287" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.950467" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:31.950632" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:31.950693" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:31.905516" elapsed="0.045274">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:32.980717" 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-11T00:49:32.980228" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:32.981216" 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-11T00:49:32.980921" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:32.981291" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:49:32.981475" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:32.979837" elapsed="0.001664"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:32.986038" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:32.985851" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:32.986215" elapsed="0.000205"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:32.986783" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:32.986575" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:32.987251" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:32.986990" elapsed="0.000303"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:32.987455" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:32.987991" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:32.987787" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:32.988441" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:32.988183" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:32.988974" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:32.988635" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:32.989411" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:32.989164" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:32.989883" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:32.989604" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:32.996527" elapsed="0.000283"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:33.005150" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:33.005918" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:33.005532" elapsed="0.000413"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:33.007069" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:33.006542" elapsed="0.000708">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:33.007431" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:33.006129" elapsed="0.001422">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.007728" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.007903" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.008078" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.008247" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.008429" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.008595" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.008758" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.008926" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.009088" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.009356" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.009595" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.009788" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:33.009228" elapsed="0.000641"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:33.009158" elapsed="0.000739"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.010037" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:33.010098" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:33.004664" elapsed="0.005543">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:33.010276" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:32.994190" elapsed="0.016186">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.010567" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.014703" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.014942" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:33.015009" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:32.985297" elapsed="0.029818">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:33.015357" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:33.015464" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:32.984747" elapsed="0.030741"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:33.015698" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:33.015578" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:33.015557" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:33.017096" elapsed="0.000217"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:33.017809" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:33.017500" elapsed="0.000335"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:33.018654" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:33.018354" elapsed="0.000391">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:33.018807" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:33.018017" elapsed="0.000893">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.019082" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.019279" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.019483" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.019657" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.019823" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.019987" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.020152" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.020322" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.020498" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.020900" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.021077" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.021238" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:33.020627" elapsed="0.000664"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:33.020564" elapsed="0.000753"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.021471" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:33.021531" elapsed="0.000055"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:33.016532" elapsed="0.005150">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:33.021793" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:33.021837" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:33.015913" elapsed="0.005946"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:33.022486" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:33.022154" elapsed="0.000392">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:33.021940" elapsed="0.000669">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:33.021922" elapsed="0.000719">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:33.022686" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:32.984185" elapsed="0.038600">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.022960" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.023125" elapsed="0.000032"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:33.023200" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:32.981796" elapsed="0.041503">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.023482" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.023662" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.023831" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.023991" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.024158" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:33.024318" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:33.024395" elapsed="0.000018"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:32.979033" elapsed="0.045464">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:34.054663" 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-11T00:49:34.054177" elapsed="0.000519"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:34.055247" 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-11T00:49:34.054951" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:34.055322" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:49:34.055515" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:34.053793" elapsed="0.001747"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:34.060171" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:34.059980" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:34.060350" elapsed="0.000208"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:34.060917" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:34.060710" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:34.061377" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:34.061123" elapsed="0.000312"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:34.061581" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:34.062132" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:34.061922" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:34.062589" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:34.062326" elapsed="0.000304"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:34.063294" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:34.062781" elapsed="0.000540"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:34.063750" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:34.063507" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:34.064230" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:34.063945" elapsed="0.000310"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:34.070552" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:34.079330" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:34.080094" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:34.079709" elapsed="0.000410"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:34.081292" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:34.080764" elapsed="0.000697">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:34.081634" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:34.080344" elapsed="0.001410">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.081929" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.082101" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.082274" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.082470" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.082637" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.082798" elapsed="0.000065"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.083012" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.083181" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.083343" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.083636" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.083859" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.084051" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:34.083508" elapsed="0.000624"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:34.083435" elapsed="0.000727"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.084306" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:34.084365" elapsed="0.000030"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:34.078843" elapsed="0.005651">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:34.084561" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:34.068349" elapsed="0.016310">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.084833" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.089096" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.089339" elapsed="0.000025"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:34.089432" elapsed="0.000019"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:34.059445" elapsed="0.030113">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:34.089726" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:34.089777" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:34.058878" elapsed="0.030925"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:34.090054" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:34.089908" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:34.089883" elapsed="0.000247"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:34.091537" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:34.092207" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:34.091902" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:34.093032" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:34.092766" elapsed="0.000401">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:34.093231" elapsed="0.000182"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:34.092427" elapsed="0.001083">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.093709" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.093882" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.094053" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.094218" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.094395" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.094559" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.094719" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.094885" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.095044" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.095298" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.095486" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.095646" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:34.095173" elapsed="0.000525"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:34.095108" elapsed="0.000616"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.095859" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:34.095918" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:34.090978" elapsed="0.005043">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:34.096130" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:34.096173" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:34.090306" elapsed="0.005890"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:34.096820" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:34.096505" elapsed="0.000375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:34.096275" elapsed="0.000668">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:34.096256" elapsed="0.000719">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:34.097020" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:34.058310" elapsed="0.038805">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.097289" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.097511" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:34.097588" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:34.055836" elapsed="0.041855">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.097859" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.098035" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.098205" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.098365" elapsed="0.000037"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.098556" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:34.098719" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:34.098779" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:34.052983" elapsed="0.045895">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:35.128648" 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-11T00:49:35.128138" elapsed="0.000544"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:35.129151" 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-11T00:49:35.128854" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:35.129224" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:49:35.129411" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:35.127749" elapsed="0.001688"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:35.133994" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:35.133805" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:35.134173" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:35.134747" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:35.134535" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:35.135476" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:35.134959" elapsed="0.000563"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:35.135684" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:35.136260" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:35.136027" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:35.136725" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:35.136478" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:35.137340" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:35.136920" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:35.137787" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:35.137552" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:35.138264" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:35.137980" elapsed="0.000310"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:35.144605" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:35.153100" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:35.153852" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:35.153476" elapsed="0.000402"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:35.154996" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:35.154468" elapsed="0.000680">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:35.155312" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:35.154061" elapsed="0.001385">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.155622" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.155794" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.155973" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.156141" elapsed="0.000043"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.156336" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.156518" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.156683" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.156850" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.157010" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.157272" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.157510" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.157702" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:35.157146" elapsed="0.000635"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:35.157078" elapsed="0.000732"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.157951" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:35.158009" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:35.152617" elapsed="0.005496">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:35.158181" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:35.142397" elapsed="0.015882">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.158508" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.162748" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.162940" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:35.163007" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:35.133242" elapsed="0.029872">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:35.163224" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:35.163267" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:35.132690" elapsed="0.030600"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:35.163541" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:35.163375" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:35.163355" elapsed="0.000254"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:35.164954" elapsed="0.000232"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:35.165670" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:35.165350" elapsed="0.000346"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:35.166494" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:35.166213" elapsed="0.000376">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:35.166651" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:35.165876" elapsed="0.000878">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.166927" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.167098" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.167273" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.167466" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.167635" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.167799" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.167963" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.168179" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.168349" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.168620" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.168791" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.168951" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:35.168493" elapsed="0.000545"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:35.168430" elapsed="0.000635"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.169206" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:35.169266" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:35.164414" elapsed="0.004957">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:35.169500" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:35.169544" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:35.163759" elapsed="0.005809"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:35.170171" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:35.169861" elapsed="0.000373">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:35.169649" elapsed="0.000648">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:35.169630" elapsed="0.000700">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:35.170396" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:35.132094" elapsed="0.038402">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.170671" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.170835" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:35.170896" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:35.129740" elapsed="0.041253">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.171160" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.171335" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.171519" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.171678" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.171843" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:35.172003" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:35.172067" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:35.126960" elapsed="0.045226">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:36.205003" 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-11T00:49:36.204544" elapsed="0.000494"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:36.205518" 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-11T00:49:36.205206" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:36.205593" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:49:36.205764" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:36.204138" elapsed="0.001651"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:36.210399" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:36.210192" elapsed="0.000235"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:36.210580" elapsed="0.000202"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:36.211169" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:36.210956" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:36.211661" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:36.211376" elapsed="0.000331"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:36.211855" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:36.212408" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:36.212186" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:36.212848" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:36.212602" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:36.213394" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:36.213040" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:36.213823" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:36.213588" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:36.214298" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:36.214017" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:36.220783" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:36.229409" elapsed="0.000226"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:36.230178" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:36.229792" elapsed="0.000412"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:36.231347" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:36.230800" elapsed="0.000723">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:36.231681" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:36.230408" elapsed="0.001393">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.231977" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.232148" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.232341" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.232559" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.232786" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.233026" elapsed="0.000028"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.233228" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.233467" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.233650" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.233917" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.234143" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.234333" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:36.233789" elapsed="0.000662"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:36.233719" elapsed="0.000761"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.234623" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:36.234684" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:36.228887" elapsed="0.005906">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:36.234886" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:36.218592" elapsed="0.016397">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.235164" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.239366" elapsed="0.000043"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.239587" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:36.239654" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:36.209651" elapsed="0.030108">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:36.239870" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:36.239913" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:36.209078" elapsed="0.030857"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:36.240135" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:36.240021" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:36.240000" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:36.241514" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:36.242215" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:36.241910" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:36.243063" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:36.242781" elapsed="0.000369">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:36.243211" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:36.242445" elapsed="0.000869">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.243506" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.243679" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.243851" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.244018" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.244180" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.244341" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.244522" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.244692" elapsed="0.001867"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.246716" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.246991" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.247161" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.247320" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:36.246862" elapsed="0.000510"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:36.246782" elapsed="0.000632"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.247558" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:36.247617" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:36.240964" elapsed="0.006759">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:36.247834" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:36.247878" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:36.240356" elapsed="0.007545"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:36.248532" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:36.248197" elapsed="0.000396">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:36.247982" elapsed="0.000674">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:36.247964" elapsed="0.000725">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:36.248734" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:36.208518" elapsed="0.040313">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.249046" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.249213" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:36.249276" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:36.206086" elapsed="0.043324">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.249590" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.249770" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.249940" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.250103" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.250268" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:36.250446" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:36.250509" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:36.203360" elapsed="0.047247">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:37.283044" 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-11T00:49:37.282567" elapsed="0.000511"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:37.283565" 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-11T00:49:37.283251" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:37.283640" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:49:37.283814" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:37.282147" elapsed="0.001691"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:37.288448" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:37.288238" elapsed="0.000240"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:37.288633" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:37.289183" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:37.288976" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:37.289664" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:37.289408" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:37.289852" elapsed="0.000209"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:37.290432" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:37.290212" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:37.290975" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:37.290726" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:37.291539" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:37.291170" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:37.292201" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:37.291731" elapsed="0.000516"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:37.292705" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:37.292415" elapsed="0.000317"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:37.299051" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:37.307744" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:37.308519" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:37.308111" elapsed="0.000435"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:37.309702" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:37.309144" elapsed="0.000716">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:37.310040" elapsed="0.000027"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:37.308731" elapsed="0.001442">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.310353" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.310554" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.310731" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.310901" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.311067" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.311233" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.311411" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.311585" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.311747" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.312018" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.312244" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.312453" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:37.311889" elapsed="0.000647"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:37.311818" elapsed="0.000748"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.312709" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:37.312768" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:37.307216" elapsed="0.005661">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:37.312947" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:37.296853" elapsed="0.016236">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.313266" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.317443" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.317642" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:37.317709" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:37.287697" elapsed="0.030118">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:37.317955" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:37.318001" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:37.287125" elapsed="0.030900"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:37.318241" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:37.318116" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:37.318093" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:37.319622" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:37.320282" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:37.319983" elapsed="0.000325"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:37.321103" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:37.320841" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:37.321252" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:37.320504" elapsed="0.000851">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.321552" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.321724" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.321913" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.322085" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.322250" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.322425" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.322595" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.322762" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.322922" elapsed="0.000055"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.323366" elapsed="0.000037"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.323560" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.323723" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:37.323088" elapsed="0.000688"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:37.323024" elapsed="0.000779"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.323943" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:37.324001" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:37.319068" elapsed="0.005038">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:37.324217" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:37.324261" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:37.318471" elapsed="0.005812"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:37.324914" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:37.324592" elapsed="0.000382">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:37.324364" elapsed="0.000673">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:37.324345" elapsed="0.000724">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:37.325114" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:37.286576" elapsed="0.038635">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.325402" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.325572" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:37.325634" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:37.284136" elapsed="0.041597">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.325926" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.326104" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.326271" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.326446" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.326615" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:37.326778" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:37.326837" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:37.281278" elapsed="0.045692">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:38.359986" 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-11T00:49:38.359518" elapsed="0.000501"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:38.360505" 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-11T00:49:38.360191" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:38.360580" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:49:38.360750" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:38.359099" elapsed="0.001676"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:38.365423" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:38.365201" elapsed="0.000251"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:38.365604" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:38.366161" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:38.365951" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:38.366678" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:38.366370" elapsed="0.000350"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:38.366869" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:38.367418" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:38.367199" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:38.367855" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:38.367613" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:38.368396" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:38.368046" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:38.368822" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:38.368590" elapsed="0.000277"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:38.369598" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:38.369019" elapsed="0.000608"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:38.375882" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:38.384449" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:38.385212" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:38.384817" elapsed="0.000420"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:38.386407" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:38.385860" elapsed="0.000702">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:38.386725" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:38.385464" elapsed="0.001378">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.387016" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.387256" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.387451" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.387629" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.387797" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.387963" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.388128" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.388298" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.388474" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.388746" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.388970" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.389162" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:38.388617" elapsed="0.000626"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:38.388545" elapsed="0.000728"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.389447" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:38.389508" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:38.383947" elapsed="0.005668">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:38.389683" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:38.373717" elapsed="0.016064">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.389957" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.394135" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.394333" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:38.394454" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:38.364665" elapsed="0.029899">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:38.394676" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:38.394719" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:38.364088" elapsed="0.030654"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:38.395005" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:38.394890" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:38.394868" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:38.396368" elapsed="0.000221"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:38.397043" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:38.396742" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:38.397876" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:38.397613" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:38.398024" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:38.397247" elapsed="0.000880">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.398296" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.398492" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.398668" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.398835" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.399025" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.399226" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.399411" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.399581" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.399743" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.400148" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.400320" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.400496" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:38.400017" elapsed="0.000532"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:38.399806" elapsed="0.000770"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.400714" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:38.400772" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:38.395824" elapsed="0.005055">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:38.400990" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:38.401033" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:38.395221" elapsed="0.005834"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:38.401714" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:38.401350" elapsed="0.000424">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:38.401136" elapsed="0.000700">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:38.401117" elapsed="0.000785">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:38.401951" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:38.363542" elapsed="0.038507">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.402224" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.402404" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:38.402468" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:38.361094" elapsed="0.041477">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.402736" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.402913" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.403079" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.403240" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.403417" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:38.403582" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:38.403642" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:38.358191" elapsed="0.045549">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:39.434113" 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-11T00:49:39.433640" elapsed="0.000506"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:39.434636" 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-11T00:49:39.434319" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:39.434714" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:49:39.435033" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:39.433230" elapsed="0.001828"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:39.439678" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:39.439479" elapsed="0.000226"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:39.439856" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:39.440418" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:39.440196" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:39.441011" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:39.440721" elapsed="0.000334"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:39.441205" elapsed="0.000197"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:39.441767" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:39.441558" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:39.442209" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:39.441963" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:39.442964" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:39.442429" elapsed="0.000562"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:39.443416" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:39.443161" elapsed="0.000301"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:39.443908" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:39.443613" elapsed="0.000322"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:39.450432" elapsed="0.000214"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:39.459028" elapsed="0.000253"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:39.459842" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:39.459457" elapsed="0.000411"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:39.461020" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:39.460469" elapsed="0.000702">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:39.461334" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:39.460054" elapsed="0.001417">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.461647" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.461819" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.461994" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.462162" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.462326" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.462505" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.462670" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.462839" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.463001" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.463270" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.463510" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.463705" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:39.463140" elapsed="0.000654"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:39.463070" elapsed="0.000752"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.463965" elapsed="0.000055"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:39.464062" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:39.458540" elapsed="0.005632">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:39.464242" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:39.448075" elapsed="0.016269">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.464537" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.468717" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.468947" elapsed="0.000024"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:39.469020" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:39.438928" elapsed="0.030205">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:39.469249" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:39.469295" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:39.438362" elapsed="0.030958"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:39.469543" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:39.469425" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:39.469401" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:39.470945" elapsed="0.000216"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:39.471657" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:39.471318" elapsed="0.000368"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:39.472506" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:39.472218" elapsed="0.000379">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:39.472662" elapsed="0.000161"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:39.471873" elapsed="0.001071">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.473124" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.473331" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.473530" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.473705" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.473910" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.474080" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.474248" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.474437" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.474606" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.474864" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.475036" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.475199" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:39.474736" elapsed="0.000516"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:39.474673" elapsed="0.000606"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.475434" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:39.475495" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:39.470369" elapsed="0.005235">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:39.475719" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:39.475764" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:39.469766" elapsed="0.006022"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:39.476420" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:39.476086" elapsed="0.000399">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:39.475871" elapsed="0.000683">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:39.475852" elapsed="0.000735">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:39.476634" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:39.437816" elapsed="0.038917">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.476936" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.477109" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:39.477173" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:39.435358" elapsed="0.041917">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.477461" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.477645" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.477815" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.478017" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.478188" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:39.478369" elapsed="0.000038"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:39.478476" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:39.432076" elapsed="0.046505">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:40.509825" 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-11T00:49:40.509333" elapsed="0.000527"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:40.510354" 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-11T00:49:40.510049" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:40.510449" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:49:40.510625" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:40.508918" elapsed="0.001732"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:40.515307" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:40.515114" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:40.515514" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:40.516082" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:40.515862" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:40.516784" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:40.516297" elapsed="0.000531"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:40.516978" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:40.517561" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:40.517328" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:40.518016" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:40.517762" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:40.518586" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:40.518218" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:40.519025" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:40.518783" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:40.519530" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:40.519227" elapsed="0.000329"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:40.525904" elapsed="0.000217"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:40.534582" elapsed="0.000221"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:40.535416" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:40.534963" elapsed="0.000484"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:40.536755" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:40.536128" elapsed="0.000786">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:40.537082" elapsed="0.000023"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:40.535718" elapsed="0.001496">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.537416" elapsed="0.000025"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.537599" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.537779" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.537950" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.538115" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.538283" elapsed="0.000025"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.538476" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.538649" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.538813" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.539090" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.539322" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.539543" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:40.538960" elapsed="0.000668"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:40.538886" elapsed="0.000773"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.539805" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:40.539867" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:40.534055" elapsed="0.005920">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:40.540046" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:40.523687" elapsed="0.016463">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.540365" elapsed="0.000049"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.544740" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.544940" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:40.545054" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:40.514561" elapsed="0.030604">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:40.545286" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:40.545331" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:40.513978" elapsed="0.031377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:40.545612" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:40.545474" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:40.545450" elapsed="0.000231"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:40.547047" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:40.547765" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:40.547438" elapsed="0.000355"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:40.548716" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:40.548422" elapsed="0.000389">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:40.548874" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:40.547983" elapsed="0.000995">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.549153" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.549325" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.549519" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.549687" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.549852" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.550013" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.550176" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.550342" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.550520" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.550781" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.550949" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.551109" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:40.550655" elapsed="0.000505"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:40.550586" elapsed="0.000601"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.551323" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:40.551394" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:40.546495" elapsed="0.005006">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:40.551611" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:40.551693" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:40.545835" elapsed="0.005883"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:40.552406" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:40.552012" elapsed="0.000458">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:40.551799" elapsed="0.000735">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:40.551781" elapsed="0.000784">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:40.552610" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:40.513420" elapsed="0.039288">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.552883" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.553049" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:40.553110" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:40.510967" elapsed="0.042240">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.553376" elapsed="0.000044"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.553591" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.553763" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.553923" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.554086" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:40.554248" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:40.554310" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:40.508003" elapsed="0.046425">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.585359" 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-11T00:49:41.584885" elapsed="0.000527"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.585902" 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-11T00:49:41.585599" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:41.585981" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:49:41.586155" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:49:41.584467" elapsed="0.001714"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:49:41.591087" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:49:41.590877" elapsed="0.000238"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:41.591294" elapsed="0.000225"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:41.591912" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:41.591679" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.592397" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:41.592125" elapsed="0.000318"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:49:41.592591" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:41.593233" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:49:41.592965" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.593819" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:41.593508" elapsed="0.000364"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.594542" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:41.594069" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.595031" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:41.594749" elapsed="0.000329"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.595543" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:41.595232" elapsed="0.000339"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:41.602275" elapsed="0.000234"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:41.610920" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.611703" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:41.611292" elapsed="0.000439"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:41.612938" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.612373" elapsed="0.000722">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.613259" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.611973" elapsed="0.001426">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.613577" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.613752" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.613927" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.614104" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.614271" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.614454" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.614622" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.614794" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.614959" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.615235" elapsed="0.000059"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.615522" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.615722" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:41.615103" elapsed="0.000716"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.615030" elapsed="0.000821"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.616039" elapsed="0.000034"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.616118" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.610428" elapsed="0.005800">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.616299" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.600081" elapsed="0.016357">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.616633" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.620778" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.620976" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.621043" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.590284" elapsed="0.030866">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:41.621269" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:41.621314" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:41.589647" elapsed="0.031691"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.621608" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:49:41.621483" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-11T00:49:41.621460" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:49:41.623025" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.623707" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:49:41.623401" elapsed="0.000332"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:49:41.624601" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.624291" elapsed="0.000399">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.624754" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.623945" elapsed="0.000950">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.625079" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.625292" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.625493" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.625671" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.625839" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.626003" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.626168" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.626345" elapsed="0.000173"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.626672" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.626930" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.627101" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.627262" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:49:41.626802" elapsed="0.000513"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.626738" elapsed="0.000603"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.627497" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.627559" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.622487" elapsed="0.005178">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:49:41.627776" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:49:41.627836" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:49:41.621868" elapsed="0.005992"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.628494" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.628156" elapsed="0.000401">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:41.627943" elapsed="0.000678">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:41.627924" elapsed="0.000729">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.628700" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.589065" elapsed="0.039739">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.629027" elapsed="0.000029"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.629209" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.629274" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:49:41.586576" elapsed="0.042800">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.629617" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.629809" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.629988" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.630156" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.630325" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.630536" elapsed="0.000026"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.630611" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.583642" elapsed="0.047073">Could not parse owner and candidates for device openflow:1</status>
</kw>
<msg time="2026-04-11T00:49:41.630819" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.377339" elapsed="30.253573">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.630990" elapsed="0.000015"/>
</return>
<var>${original_owner}</var>
<var>${original_successor_list}</var>
<arg>openflow:1</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.375303" elapsed="30.255788">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${original_successor}</var>
<arg>${original_successor_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.631265" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.631463" elapsed="0.000022"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_successor_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.631637" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_successor}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.631823" elapsed="0.000021"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor for first switch s1.</doc>
<status status="FAIL" start="2026-04-11T00:49:11.367345" elapsed="30.264645">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</test>
<test id="s1-s2-t4" name="Reconnect Extra Switches To Successors And Check OVS Connections" line="39">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.633142" level="INFO">${controller_opt} = </msg>
<var>${controller_opt}</var>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:49:41.632878" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<var>${controller_opt}</var>
<arg>${controller_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ODL_OF_PORT}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.636139" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${controller_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.636361" elapsed="0.000047"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:41.636003" elapsed="0.000443"/>
</iter>
<msg time="2026-04-11T00:49:41.636479" level="FAIL">Variable '@{original_successor_list}' not found.</msg>
<var>${index}</var>
<value>@{original_successor_list}</value>
<status status="FAIL" start="2026-04-11T00:49:41.633222" elapsed="0.003294">Variable '@{original_successor_list}' not found.</status>
</for>
<kw name="Set Controller In OVS Bridge" owner="OVSDB">
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>s2</arg>
<arg>${controller_opt}</arg>
<doc>Sets controller for the OVS bridge ${bridge} using  and OF version ${ofversion}.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.643543" elapsed="0.000027"/>
</kw>
<kw name="Set Controller In OVS Bridge" owner="OVSDB">
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>s3</arg>
<arg>${controller_opt}</arg>
<doc>Sets controller for the OVS bridge ${bridge} using  and OF version ${ofversion}.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.650542" elapsed="0.000026"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>OVSDB.Check OVS OpenFlow Connections</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>7</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.650732" elapsed="0.000020"/>
</kw>
<doc>Connect switches s2 and s3 to successor instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.632264" elapsed="0.018664">Variable '@{original_successor_list}' not found.</status>
</test>
<test id="s1-s2-t5" name="Check Network Operational Information Before Stop" line="52">
<kw name="Check OpenFlow Network Operational Information For Sample Topology" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.658120" level="INFO">${dictionary} = {'openflow:1': '4', 'openflow:2': '5', 'openflow:3': '5'}</msg>
<var>${dictionary}</var>
<arg>openflow:1=4</arg>
<arg>openflow:2=5</arg>
<arg>openflow:3=5</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:49:41.657757" elapsed="0.000392"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.666418" 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-11T00:49:41.665943" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.666957" 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-11T00:49:41.666642" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:41.667033" elapsed="0.000035"/>
</return>
<msg time="2026-04-11T00:49:41.667198" 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-11T00:49:41.665536" elapsed="0.001688"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.671341" elapsed="0.000027"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.671604" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:41.667424" elapsed="0.004238"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.667279" elapsed="0.004410"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'openflow:1': '4', 'openflow:2': '5', 'openflow:3': '5'}.</doc>
<status status="PASS" start="2026-04-11T00:49:41.664914" elapsed="0.006830"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:49:41.658366" elapsed="0.013476"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.672374" level="INFO">${dictionary} = {'openflow:1': '21', 'openflow:2': '19', 'openflow:3': '19'}</msg>
<var>${dictionary}</var>
<arg>openflow:1=21</arg>
<arg>openflow:2=19</arg>
<arg>openflow:3=19</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:49:41.672032" elapsed="0.000386"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.678326" 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-11T00:49:41.677950" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.678826" 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-11T00:49:41.678540" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:41.678896" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:49:41.679052" 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-11T00:49:41.677581" elapsed="0.001496"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.683217" elapsed="0.000027"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.683484" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:41.679245" elapsed="0.004300"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:41.679128" elapsed="0.004445"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'openflow:1': '21', 'openflow:2': '19', 'openflow:3': '19'}.</doc>
<status status="PASS" start="2026-04-11T00:49:41.677013" elapsed="0.006615"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:49:41.672610" elapsed="0.011072"/>
</kw>
<doc>Check devices in tree,2 are in operational inventory and topology in all instances in ${controller_index_list}.
Inventory should show 1x node_id per device 1x node_id per connector. Topology should show 2x node_id per device + 3x node_id per connector
+ 5x node_id per link termination. TODO: A Keyword that can calculate this based on mininet topology.</doc>
<status status="PASS" start="2026-04-11T00:49:41.655743" elapsed="0.028041"/>
</kw>
<doc>Check devices in operational inventory and topology in all cluster instances.</doc>
<status status="PASS" start="2026-04-11T00:49:41.651152" elapsed="0.032789"/>
</test>
<test id="s1-s2-t6" name="Add Configuration In Owner and Verify Before Stop" line="56">
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.696418" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.692624" elapsed="0.003839">Variable '${original_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.684176" elapsed="0.012424">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-t7" name="Modify Configuration In Owner and Verify Before Stop" line="60">
<kw name="Modify Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.709956" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.705167" elapsed="0.004847">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.696804" elapsed="0.013393">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-t8" name="Delete Configuration In Owner and Verify Before Stop" line="64">
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.716576" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.711231" elapsed="0.005413">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.710465" elapsed="0.006351">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-t9" name="Add Configuration In Successor and Verify Before Stop" line="68">
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.728974" level="FAIL">Variable '${original_successor}' not found.</msg>
<arg>${original_successor}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.725110" elapsed="0.003903">Variable '${original_successor}' not found.</status>
</kw>
<doc>Add Flow in Successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.716991" elapsed="0.012151">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s2-t10" name="Modify Configuration In Successor and Verify Before Stop" line="72">
<kw name="Modify Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.741312" level="FAIL">Variable '${original_successor}' not found.</msg>
<arg>${original_successor}</arg>
<doc>Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.737454" elapsed="0.003897">Variable '${original_successor}' not found.</status>
</kw>
<doc>Modify Flow in successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.729329" elapsed="0.012171">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s2-t11" name="Delete Configuration In Successor and Verify Before Stop" line="76">
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.746120" level="FAIL">Variable '${original_successor}' not found.</msg>
<arg>${original_successor}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.742229" elapsed="0.003931">Variable '${original_successor}' not found.</status>
</kw>
<doc>Delete Flow in Successor and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.741676" elapsed="0.004613">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s2-t12" name="Send RPC Add to Owner and Verify Before Stop" line="80">
<kw name="Send RPC Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.758557" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.754802" elapsed="0.003801">Variable '${original_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.746489" elapsed="0.012252">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-t13" name="Send RPC Delete to Owner and Verify Before Stop" line="84">
<kw name="Send RPC Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.770766" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.766992" elapsed="0.003817">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.758917" elapsed="0.012033">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-t14" name="Send RPC Add to Successor and Verify Before Stop" line="88">
<kw name="Send RPC Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.783125" level="FAIL">Variable '${original_successor}' not found.</msg>
<arg>${original_successor}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.779207" elapsed="0.003960">Variable '${original_successor}' not found.</status>
</kw>
<doc>Add Flow in Successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.771128" elapsed="0.012175">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s2-t15" name="Send RPC Delete to Successor and Verify Before Stop" line="92">
<kw name="Send RPC Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.795523" level="FAIL">Variable '${original_successor}' not found.</msg>
<arg>${original_successor}</arg>
<doc>Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.791696" elapsed="0.003866">Variable '${original_successor}' not found.</status>
</kw>
<doc>Delete Flow in Successor and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.783577" elapsed="0.012114">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s2-t16" name="Modify Network And Verify Before Stop" line="96">
<kw name="Take OpenFlow Device Link Down and Verify" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.802634" level="INFO">${dictionary} = {'"link-down":true': '1'}</msg>
<var>${dictionary}</var>
<arg>"link-down":true=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:49:41.802212" elapsed="0.000450"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<msg time="2026-04-11T00:49:41.813485" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<var>${ouput}</var>
<arg>${mininet_conn_id}</arg>
<arg>link s1 s2 down</arg>
<doc>Sends Command ${cmd} to Mininet session ${mininet_conn} and returns read buffer response.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.809576" elapsed="0.003947">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${operational_port_1}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.813725" elapsed="0.000022"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>${dictionary}</var>
<arg>openflow:1=16</arg>
<arg>openflow:2=14</arg>
<arg>openflow:3=19</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.813927" elapsed="0.000020"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>20s</arg>
<arg>2s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.814124" elapsed="0.000020"/>
</kw>
<doc>Take a link down and verify port status in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.800168" elapsed="0.014081">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Take a link down and verify port status in all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.795923" elapsed="0.018448">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s2-t17" name="Restore Network And Verify Before Stop" line="100">
<kw name="Take OpenFlow Device Link Up and Verify" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:49:41.821210" level="INFO">${dictionary} = {'"link-down":true': '0'}</msg>
<var>${dictionary}</var>
<arg>"link-down":true=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:49:41.820906" elapsed="0.000331"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<msg time="2026-04-11T00:49:41.831827" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<var>${ouput}</var>
<arg>${mininet_conn_id}</arg>
<arg>link s1 s2 up</arg>
<doc>Sends Command ${cmd} to Mininet session ${mininet_conn} and returns read buffer response.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.828079" elapsed="0.003786">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${operational_port_1}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.832059" elapsed="0.000021"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>${dictionary}</var>
<arg>openflow:1=21</arg>
<arg>openflow:2=19</arg>
<arg>openflow:3=19</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.832262" elapsed="0.000020"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.832472" elapsed="0.000021"/>
</kw>
<doc>Take the link up and verify port status in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.818929" elapsed="0.013663">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Take the link up and verify port status in all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.814609" elapsed="0.018105">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s2-t18" name="Stop Owner Instance" line="104">
<kw name="Stop_Single_Member" owner="ClusterManagement">
<msg time="2026-04-11T00:49:41.837356" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Convenience keyword that stops the specified member of the cluster.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member}</doc>
<status status="FAIL" start="2026-04-11T00:49:41.833487" elapsed="0.003928">Variable '${original_owner}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_cluster_list}</arg>
<arg>${original_successor_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.837595" elapsed="0.000022"/>
</kw>
<doc>Stop Owner Instance and verify it is dead</doc>
<status status="FAIL" start="2026-04-11T00:49:41.832931" elapsed="0.004809">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-t19" name="Check Shards Status After Stop" line="109">
<kw name="Check OpenFlow Shards Status After Cluster Event" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.842478" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Check Shards Status after some cluster event.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.838544" elapsed="0.003973">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Create original cluster list and check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.837949" elapsed="0.004696">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-t20" name="Check Entity Owner Status And Find Owner and Successor After Stop" line="113">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.854795" level="FAIL">Variable '${original_successor}' not found.</msg>
<var>${new_owner}</var>
<var>${new_successor_list}</var>
<arg>openflow:1</arg>
<arg>${original_successor}</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.850927" elapsed="0.003907">Variable '${original_successor}' not found.</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${new_successor}</var>
<arg>${new_successor_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.855012" elapsed="0.000022"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.855192" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_successor}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:41.855359" elapsed="0.000020"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.842861" elapsed="0.012653">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s2-t21" name="Check Network Operational Information After Stop" line="124">
<kw name="Check OpenFlow Network Operational Information For Sample Topology" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.863734" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Check devices in tree,2 are in operational inventory and topology in all instances in ${controller_index_list}.
Inventory should show 1x node_id per device 1x node_id per connector. Topology should show 2x node_id per device + 3x node_id per connector
+ 5x node_id per link termination. TODO: A Keyword that can calculate this based on mininet topology.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.859978" elapsed="0.003795">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Check devices in operational inventory and topology in all cluster instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.855801" elapsed="0.008102">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-t22" name="Add Configuration In Owner and Verify After Stop" line="128">
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.875541" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.872063" elapsed="0.003527">Variable '${new_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.864079" elapsed="0.011706">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-t23" name="Modify Configuration In Owner and Verify After Stop" line="132">
<kw name="Modify Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.887460" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.883959" elapsed="0.003539">Variable '${new_owner}' not found.</status>
</kw>
<doc>Modify Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.875965" elapsed="0.011662">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-t24" name="Delete Configuration In Owner and Verify After Stop" line="136">
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.891866" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.888353" elapsed="0.003550">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.887827" elapsed="0.004202">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-t25" name="Add Configuration In Successor and Verify After Stop" line="140">
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.904161" level="FAIL">Variable '${new_successor}' not found.</msg>
<arg>${new_successor}</arg>
<arg>${new_cluster_list}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.900419" elapsed="0.003779">Variable '${new_successor}' not found.</status>
</kw>
<doc>Add Flow in Successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.892203" elapsed="0.012124">Variable '${new_successor}' not found.</status>
</test>
<test id="s1-s2-t26" name="Modify Configuration In Successor and Verify After Stop" line="144">
<kw name="Modify Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.916256" level="FAIL">Variable '${new_successor}' not found.</msg>
<arg>${new_successor}</arg>
<arg>${new_cluster_list}</arg>
<doc>Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.912528" elapsed="0.003764">Variable '${new_successor}' not found.</status>
</kw>
<doc>Modify Flow in Successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.904515" elapsed="0.011919">Variable '${new_successor}' not found.</status>
</test>
<test id="s1-s2-t27" name="Delete Configuration In Successor and Verify After Stop" line="148">
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.920908" level="FAIL">Variable '${new_successor}' not found.</msg>
<arg>${new_successor}</arg>
<arg>${new_cluster_list}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.917152" elapsed="0.003793">Variable '${new_successor}' not found.</status>
</kw>
<doc>Delete Flow in Successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.916611" elapsed="0.004461">Variable '${new_successor}' not found.</status>
</test>
<test id="s1-s2-t28" name="Send RPC Add to Owner and Verify After Stop" line="152">
<kw name="Send RPC Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.932751" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.929239" elapsed="0.003549">Variable '${new_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.921246" elapsed="0.011670">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-t29" name="Send RPC Delete to Owner and Verify After Stop" line="156">
<kw name="Send RPC Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.944595" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.941073" elapsed="0.003559">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.933090" elapsed="0.011672">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-t30" name="Send RPC Add to Successor and Verify After Stop" line="160">
<kw name="Send RPC Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.956878" level="FAIL">Variable '${new_successor}' not found.</msg>
<arg>${new_successor}</arg>
<arg>${new_cluster_list}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.953121" elapsed="0.003793">Variable '${new_successor}' not found.</status>
</kw>
<doc>Add Flow in Successor and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.944938" elapsed="0.012104">Variable '${new_successor}' not found.</status>
</test>
<test id="s1-s2-t31" name="Send RPC Delete to Successor and Verify After Stop" line="164">
<kw name="Send RPC Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.968900" level="FAIL">Variable '${new_successor}' not found.</msg>
<arg>${new_successor}</arg>
<arg>${new_cluster_list}</arg>
<doc>Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.965144" elapsed="0.003833">Variable '${new_successor}' not found.</status>
</kw>
<doc>Delete Flow in Successor and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.957216" elapsed="0.011891">Variable '${new_successor}' not found.</status>
</test>
<test id="s1-s2-t32" name="Modify Network and Verify After Stop" line="168">
<kw name="Take OpenFlow Device Link Down and Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.977156" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Take a link down and verify port status in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.973407" elapsed="0.003786">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Take a link down and verify port status in all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.969283" elapsed="0.008034">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-t33" name="Restore Network and Verify After Stop" line="172">
<kw name="Take OpenFlow Device Link Up and Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:49:41.985415" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Take the link up and verify port status in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.981628" elapsed="0.003825">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Take the link up and verify port status in all instances.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.977505" elapsed="0.008073">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-t34" name="Start Old Owner Instance" line="176">
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-04-11T00:49:41.989944" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.986202" elapsed="0.003779">Variable '${original_owner}' not found.</status>
</kw>
<doc>Start old Owner Instance and verify it is up</doc>
<status status="FAIL" start="2026-04-11T00:49:41.985751" elapsed="0.004355">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-t35" name="Check Shards Status After Start" line="180">
<kw name="Check OpenFlow Shards Status After Cluster Event" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:42.011489" elapsed="0.000246"/>
</kw>
<msg time="2026-04-11T00:49:42.011790" 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-11T00:49:42.010838" elapsed="0.001006"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:42.010366" elapsed="0.001554"/>
</kw>
<msg time="2026-04-11T00:49:42.011965" 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-11T00:49:42.002367" elapsed="0.009641"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:42.001975" elapsed="0.010105"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:42.012527" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:42.012256" elapsed="0.000316"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:42.017510" 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-11T00:49:42.017111" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:42.017984" 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-11T00:49:42.017697" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:42.018056" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:49:42.018214" 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-11T00:49:42.016743" elapsed="0.001496"/>
</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-11T00:49:42.018406" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:42.019051" level="INFO">${ds_type} = operational</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-11T00:49:42.018721" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:42.019488" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:42.019232" elapsed="0.000282"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:42.019929" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:42.019689" elapsed="0.000266"/>
</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-11T00:49:42.020537" 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-11T00:49:42.020842" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:42.020693" elapsed="0.000206"/>
</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-11T00:49:42.021063" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:42.020923" elapsed="0.000194"/>
</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-11T00:49:42.021281" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:42.021141" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:42.020672" elapsed="0.000683"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:42.020351" elapsed="0.001042"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:42.020001" elapsed="0.001420"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:42.021460" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:49:42.021660" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:42.021706" 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-11T00:49:42.016023" elapsed="0.005705"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:42.022167" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:42.022244" 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-11T00:49:42.021897" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:42.022841" 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-11T00:49:42.022566" elapsed="0.000344">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:42.022335" elapsed="0.000637">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:42.022318" elapsed="0.000685">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-11T00:49:42.023154" 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-11T00:49:42.023325" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:42.023405" elapsed="0.000016"/>
</return>
<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>
<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-11T00:49:42.013563" elapsed="0.009949">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:42.013323" elapsed="0.010258">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:42.013181" elapsed="0.010465">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:42.012793" elapsed="0.010943">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:42.023964" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.993635" elapsed="0.030444">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:43.048977" elapsed="0.000239"/>
</kw>
<msg time="2026-04-11T00:49:43.049282" 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-11T00:49:43.048314" elapsed="0.001032"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:43.047856" elapsed="0.001586"/>
</kw>
<msg time="2026-04-11T00:49:43.049487" 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-11T00:49:43.039814" elapsed="0.009717"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:43.039405" elapsed="0.010295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:43.050156" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:43.049890" elapsed="0.000312"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:43.055443" 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-11T00:49:43.055022" elapsed="0.000449"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:43.055922" 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-11T00:49:43.055633" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:43.055995" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:49:43.056154" 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-11T00:49:43.054652" elapsed="0.001527"/>
</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-11T00:49:43.056329" elapsed="0.000169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:43.057000" level="INFO">${ds_type} = operational</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-11T00:49:43.056661" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:43.057434" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:43.057182" elapsed="0.000279"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:43.057845" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:43.057608" 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-11T00:49:43.058259" 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-11T00:49:43.058526" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:43.058364" elapsed="0.000217"/>
</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-11T00:49:43.058745" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:43.058606" elapsed="0.000191"/>
</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-11T00:49:43.058957" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:43.058820" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:43.058346" elapsed="0.000683"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:43.058096" elapsed="0.000957"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:43.057916" elapsed="0.001181"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:43.059140" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:49:43.059338" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:43.059403" 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-11T00:49:43.053925" elapsed="0.005504"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:43.059861" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:43.059937" 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-11T00:49:43.059598" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:43.060540" 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-11T00:49:43.060240" elapsed="0.000370">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:43.060028" elapsed="0.000650">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:43.060010" 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-11T00:49:43.060857" 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-11T00:49:43.061026" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:43.061126" elapsed="0.000017"/>
</return>
<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>
<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-11T00:49:43.051224" elapsed="0.010013">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:43.050980" elapsed="0.010326">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:43.050841" elapsed="0.010520">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:43.050443" elapsed="0.011025">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:43.061699" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:43.024949" elapsed="0.036864">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:44.086653" elapsed="0.000301"/>
</kw>
<msg time="2026-04-11T00:49:44.087022" 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-11T00:49:44.085912" elapsed="0.001175"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:44.085426" elapsed="0.001742"/>
</kw>
<msg time="2026-04-11T00:49:44.087215" 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-11T00:49:44.077167" elapsed="0.010094"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:44.076749" elapsed="0.010588"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:44.087812" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:44.087548" elapsed="0.000312"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:44.093068" 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-11T00:49:44.092655" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:44.093563" 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-11T00:49:44.093257" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:44.093651" elapsed="0.000037"/>
</return>
<msg time="2026-04-11T00:49:44.093838" 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-11T00:49:44.092209" elapsed="0.001660"/>
</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-11T00:49:44.094066" elapsed="0.000194"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:44.094864" level="INFO">${ds_type} = operational</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-11T00:49:44.094484" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:44.095328" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:44.095048" elapsed="0.000310"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:44.095861" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:44.095568" elapsed="0.000324"/>
</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-11T00:49:44.096294" 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-11T00:49:44.096569" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:44.096417" elapsed="0.000226"/>
</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-11T00:49:44.096891" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:44.096739" elapsed="0.000208"/>
</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-11T00:49:44.097114" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:44.096971" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:44.096398" elapsed="0.000793"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:44.096128" elapsed="0.001088"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:44.095947" elapsed="0.001295"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:44.097283" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:49:44.097518" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:44.097581" 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-11T00:49:44.091474" elapsed="0.006139"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:44.098170" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:44.098253" 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-11T00:49:44.097842" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:44.099133" 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-11T00:49:44.098605" elapsed="0.000603">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:44.098348" elapsed="0.000931">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:44.098330" elapsed="0.000980">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-11T00:49:44.099485" elapsed="0.000023"/>
</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-11T00:49:44.099662" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:44.099728" elapsed="0.000016"/>
</return>
<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>
<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-11T00:49:44.088897" elapsed="0.010939">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:44.088666" elapsed="0.011242">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:44.088523" elapsed="0.011440">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:44.088089" elapsed="0.011965">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:44.100285" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:44.062777" elapsed="0.037638">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:45.124477" elapsed="0.000246"/>
</kw>
<msg time="2026-04-11T00:49:45.124791" 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-11T00:49:45.123815" elapsed="0.001040"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:45.123348" elapsed="0.001587"/>
</kw>
<msg time="2026-04-11T00:49:45.124979" 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-11T00:49:45.115344" elapsed="0.009678"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:45.114937" elapsed="0.010158"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:45.125557" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:45.125286" elapsed="0.000316"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:45.130688" 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-11T00:49:45.130288" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:45.131159" 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-11T00:49:45.130873" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:45.131233" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:49:45.131404" 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-11T00:49:45.129901" elapsed="0.001530"/>
</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-11T00:49:45.131581" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:45.132220" level="INFO">${ds_type} = operational</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-11T00:49:45.131890" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:45.133884" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:45.132416" elapsed="0.001497"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:45.134340" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:45.134088" elapsed="0.000279"/>
</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-11T00:49:45.134779" 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-11T00:49:45.135033" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:45.134885" 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-11T00:49:45.135254" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:45.135113" 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-11T00:49:45.135488" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:45.135331" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:45.134867" elapsed="0.000698"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:45.134613" elapsed="0.000975"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:45.134429" elapsed="0.001185"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:45.135653" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:49:45.135853" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:45.135900" 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-11T00:49:45.129181" elapsed="0.006742"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:45.136372" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:45.136467" 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-11T00:49:45.136092" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:45.137057" 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-11T00:49:45.136779" elapsed="0.000350">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:45.136562" elapsed="0.000632">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:45.136543" elapsed="0.000683">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-11T00:49:45.137378" elapsed="0.000036"/>
</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-11T00:49:45.137565" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:45.137632" elapsed="0.000015"/>
</return>
<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>
<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-11T00:49:45.126726" elapsed="0.011010">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:45.126496" elapsed="0.011311">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:45.126335" elapsed="0.011567">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:45.125917" elapsed="0.012078">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:45.138247" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:45.101321" elapsed="0.037043">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:46.167942" elapsed="0.000277"/>
</kw>
<msg time="2026-04-11T00:49:46.168307" 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-11T00:49:46.167259" elapsed="0.001149"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:46.166788" elapsed="0.001717"/>
</kw>
<msg time="2026-04-11T00:49:46.168555" 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-11T00:49:46.158480" elapsed="0.010119"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:46.157508" elapsed="0.011164"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:46.169147" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:46.168887" elapsed="0.000306"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:46.174755" 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-11T00:49:46.174341" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:46.175233" 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-11T00:49:46.174944" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:46.175313" elapsed="0.000036"/>
</return>
<msg time="2026-04-11T00:49:46.175504" 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-11T00:49:46.173963" elapsed="0.001566"/>
</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-11T00:49:46.175686" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:46.176344" level="INFO">${ds_type} = operational</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-11T00:49:46.176007" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:46.176794" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:46.176553" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:46.177209" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:46.176969" elapsed="0.000266"/>
</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-11T00:49:46.177675" 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-11T00:49:46.177945" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:46.177790" elapsed="0.000211"/>
</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-11T00:49:46.178168" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:46.178028" elapsed="0.000192"/>
</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-11T00:49:46.178398" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:46.178243" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:46.177769" elapsed="0.000788"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:46.177483" elapsed="0.001105"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:46.177282" elapsed="0.001334"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:46.178659" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:49:46.178863" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:46.178909" 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-11T00:49:46.173210" elapsed="0.005722"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:46.179394" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:46.179474" 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-11T00:49:46.179105" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:46.180084" 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-11T00:49:46.179785" elapsed="0.000383">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:46.179567" elapsed="0.000672">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:46.179549" elapsed="0.000721">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-11T00:49:46.180437" elapsed="0.000023"/>
</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-11T00:49:46.180613" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:46.180678" elapsed="0.000015"/>
</return>
<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>
<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-11T00:49:46.170331" elapsed="0.010457">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:46.170061" elapsed="0.010796">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:46.169891" elapsed="0.011021">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:46.169452" elapsed="0.011551">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:46.181234" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:46.139538" elapsed="0.041812">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:47.206151" elapsed="0.000250"/>
</kw>
<msg time="2026-04-11T00:49:47.206477" 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-11T00:49:47.205505" elapsed="0.001037"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:47.204990" elapsed="0.001632"/>
</kw>
<msg time="2026-04-11T00:49:47.206667" 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-11T00:49:47.196560" elapsed="0.010152"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:47.195973" elapsed="0.010811"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:47.207228" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:47.206973" elapsed="0.000299"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:47.212209" 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-11T00:49:47.211825" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:47.212701" 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-11T00:49:47.212410" elapsed="0.000393"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:47.212853" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:49:47.213015" 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-11T00:49:47.211458" elapsed="0.001583"/>
</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-11T00:49:47.213206" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:47.213886" level="INFO">${ds_type} = operational</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-11T00:49:47.213548" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:47.214312" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:47.214072" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:47.214745" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:47.214504" elapsed="0.000267"/>
</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-11T00:49:47.215309" 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-11T00:49:47.215583" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:47.215435" 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-11T00:49:47.215804" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:47.215664" 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-11T00:49:47.216024" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:47.215882" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:47.215415" elapsed="0.000685"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:47.215144" elapsed="0.000979"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:47.214818" elapsed="0.001331"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:47.216189" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:49:47.216403" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:47.216452" 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-11T00:49:47.210740" elapsed="0.005735"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:47.216913" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:47.216990" 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-11T00:49:47.216646" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:47.217832" 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-11T00:49:47.217332" elapsed="0.000572">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:47.217106" elapsed="0.000866">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:47.217084" elapsed="0.000919">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-11T00:49:47.218156" 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-11T00:49:47.218329" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:47.218408" elapsed="0.000016"/>
</return>
<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>
<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-11T00:49:47.208267" elapsed="0.010249">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:47.208042" elapsed="0.010542">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:47.207901" elapsed="0.010738">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:47.207510" elapsed="0.011219">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:47.218956" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:47.182246" elapsed="0.036864">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:48.247549" elapsed="0.000258"/>
</kw>
<msg time="2026-04-11T00:49:48.247878" 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-11T00:49:48.246871" elapsed="0.001076"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:48.246399" elapsed="0.001629"/>
</kw>
<msg time="2026-04-11T00:49:48.248075" 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-11T00:49:48.236903" elapsed="0.011216"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:48.236266" elapsed="0.011926"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:48.248681" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:48.248402" elapsed="0.000325"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:48.253829" 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-11T00:49:48.253443" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:48.254301" 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-11T00:49:48.254017" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:48.254376" elapsed="0.000048"/>
</return>
<msg time="2026-04-11T00:49:48.254552" 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-11T00:49:48.253058" elapsed="0.001518"/>
</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-11T00:49:48.254727" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:48.255426" level="INFO">${ds_type} = operational</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-11T00:49:48.255037" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:48.256060" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:48.255612" elapsed="0.000475"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:48.256492" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:48.256236" elapsed="0.000282"/>
</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-11T00:49:48.256946" elapsed="0.000030"/>
</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-11T00:49:48.257214" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:48.257065" elapsed="0.000206"/>
</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-11T00:49:48.257453" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:48.257297" elapsed="0.000212"/>
</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-11T00:49:48.257672" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:48.257532" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:48.257046" elapsed="0.000701"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:48.256779" elapsed="0.000992"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:48.256593" elapsed="0.001205"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:48.257838" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:49:48.258037" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:48.258082" 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-11T00:49:48.252297" elapsed="0.005808"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:48.258651" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:48.258734" 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-11T00:49:48.258356" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:48.259329" 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-11T00:49:48.259044" elapsed="0.000384">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:48.258827" elapsed="0.000670">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:48.258809" elapsed="0.000720">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-11T00:49:48.259681" 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-11T00:49:48.259854" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:48.259918" elapsed="0.000015"/>
</return>
<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>
<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-11T00:49:48.249810" elapsed="0.010214">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:48.249566" elapsed="0.010529">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:48.249408" elapsed="0.010744">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:48.248980" elapsed="0.011259">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:48.260485" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:48.220317" elapsed="0.040299">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:49.287607" elapsed="0.000257"/>
</kw>
<msg time="2026-04-11T00:49:49.287938" 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-11T00:49:49.286937" elapsed="0.001069"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:49.286474" elapsed="0.001651"/>
</kw>
<msg time="2026-04-11T00:49:49.288173" 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-11T00:49:49.277404" elapsed="0.010814"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:49.276783" elapsed="0.011510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:49.288764" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:49.288502" elapsed="0.000308"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:49.295344" 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-11T00:49:49.294851" elapsed="0.000543"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:49.295985" 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-11T00:49:49.295598" elapsed="0.000423"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:49.296104" elapsed="0.000047"/>
</return>
<msg time="2026-04-11T00:49:49.296329" 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-11T00:49:49.294375" elapsed="0.001985"/>
</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-11T00:49:49.296685" elapsed="0.000222"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:49.297604" level="INFO">${ds_type} = operational</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-11T00:49:49.297131" elapsed="0.000508"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:49.298146" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:49.297861" elapsed="0.000312"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:49.298591" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:49.298324" elapsed="0.000293"/>
</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-11T00:49:49.299025" 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-11T00:49:49.299285" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:49.299136" elapsed="0.000207"/>
</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-11T00:49:49.299528" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:49.299368" elapsed="0.000216"/>
</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-11T00:49:49.299750" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:49.299608" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:49.299115" elapsed="0.000708"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:49.298856" elapsed="0.000990"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:49.298666" elapsed="0.001208"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:49.299914" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:49:49.300135" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:49.300182" 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-11T00:49:49.293521" elapsed="0.006686"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:49.300672" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:49.300749" 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-11T00:49:49.300377" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:49.301351" 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-11T00:49:49.301059" elapsed="0.000381">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:49.300841" elapsed="0.000667">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:49.300824" elapsed="0.000716">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-11T00:49:49.301693" elapsed="0.000024"/>
</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-11T00:49:49.301871" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:49.301935" elapsed="0.000016"/>
</return>
<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>
<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-11T00:49:49.290047" elapsed="0.011996">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:49.289735" elapsed="0.012379">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:49.289541" elapsed="0.012628">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:49.289037" elapsed="0.013224">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:49.302544" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:49.261587" elapsed="0.041076">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:50.328396" elapsed="0.000257"/>
</kw>
<msg time="2026-04-11T00:49:50.328721" 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-11T00:49:50.327576" elapsed="0.001211"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:50.327076" elapsed="0.001791"/>
</kw>
<msg time="2026-04-11T00:49:50.328913" 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-11T00:49:50.318974" elapsed="0.009982"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:50.318550" elapsed="0.010479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:50.329493" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:50.329222" elapsed="0.000317"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:50.334531" 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-11T00:49:50.334131" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:50.334997" 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-11T00:49:50.334716" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:50.335072" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:49:50.335232" 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-11T00:49:50.333764" elapsed="0.001492"/>
</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-11T00:49:50.335420" elapsed="0.000187"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:50.336101" level="INFO">${ds_type} = operational</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-11T00:49:50.335765" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:50.336535" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:50.336281" elapsed="0.000280"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:50.336942" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:50.336707" elapsed="0.000261"/>
</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-11T00:49:50.337356" elapsed="0.000037"/>
</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-11T00:49:50.337628" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:50.337480" 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-11T00:49:50.337856" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:50.337717" elapsed="0.000191"/>
</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-11T00:49:50.338069" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:50.337931" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:50.337460" elapsed="0.000681"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:50.337193" elapsed="0.000973"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:50.337013" elapsed="0.001179"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:50.338231" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:49:50.338444" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:50.338490" 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-11T00:49:50.333044" elapsed="0.005469"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:50.338947" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:50.339023" 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-11T00:49:50.338680" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:50.339869" 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-11T00:49:50.339571" elapsed="0.000377">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:50.339155" elapsed="0.000862">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:50.339137" elapsed="0.000912">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-11T00:49:50.340201" 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-11T00:49:50.340374" elapsed="0.000036"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:50.340456" elapsed="0.000016"/>
</return>
<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>
<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-11T00:49:50.330553" elapsed="0.010011">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:50.330303" elapsed="0.010328">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:50.330161" elapsed="0.010524">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:50.329769" elapsed="0.011001">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:50.340997" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:50.303965" elapsed="0.037146">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:51.368681" elapsed="0.000245"/>
</kw>
<msg time="2026-04-11T00:49:51.368998" 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-11T00:49:51.367984" elapsed="0.001092"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:51.367368" elapsed="0.001828"/>
</kw>
<msg time="2026-04-11T00:49:51.369259" 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-11T00:49:51.358008" elapsed="0.011313"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:51.357501" elapsed="0.011936"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:51.369988" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:51.369650" elapsed="0.000385"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:51.375550" 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-11T00:49:51.375131" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:51.376028" 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-11T00:49:51.375740" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:51.376116" elapsed="0.000035"/>
</return>
<msg time="2026-04-11T00:49:51.376288" 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-11T00:49:51.374690" elapsed="0.001631"/>
</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-11T00:49:51.376499" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:51.377163" level="INFO">${ds_type} = operational</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-11T00:49:51.376820" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:51.377627" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:51.377365" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:51.378158" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:51.377908" 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-11T00:49:51.378618" 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-11T00:49:51.378876" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:51.378727" 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-11T00:49:51.379116" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:51.378958" elapsed="0.000213"/>
</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-11T00:49:51.379333" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:51.379194" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:51.378708" elapsed="0.000717"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:51.378447" elapsed="0.001002"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:51.378232" elapsed="0.001243"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:51.379514" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:49:51.379716" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:51.379761" 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-11T00:49:51.373912" elapsed="0.005872"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:51.380240" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:51.380317" 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-11T00:49:51.379956" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:51.380930" 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-11T00:49:51.380644" elapsed="0.000362">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:51.380425" elapsed="0.000664">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:51.380406" elapsed="0.000728">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-11T00:49:51.381301" 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-11T00:49:51.381492" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:51.381558" elapsed="0.000016"/>
</return>
<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>
<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-11T00:49:51.371129" elapsed="0.010537">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:51.370868" elapsed="0.010868">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:51.370722" elapsed="0.011074">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:51.370301" elapsed="0.011583">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:51.382117" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:51.342205" elapsed="0.040042">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:52.407293" elapsed="0.000260"/>
</kw>
<msg time="2026-04-11T00:49:52.407632" 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-11T00:49:52.406650" elapsed="0.001052"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:52.406141" elapsed="0.001643"/>
</kw>
<msg time="2026-04-11T00:49:52.407926" 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-11T00:49:52.398055" elapsed="0.009918"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:52.397621" elapsed="0.010426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:52.408510" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:52.408238" elapsed="0.000316"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:52.413531" 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-11T00:49:52.413129" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:52.414001" 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-11T00:49:52.413718" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:52.414074" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:49:52.414232" 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-11T00:49:52.412765" elapsed="0.001491"/>
</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-11T00:49:52.414419" elapsed="0.000169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:52.415077" level="INFO">${ds_type} = operational</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-11T00:49:52.414746" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:52.415512" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:52.415258" elapsed="0.000280"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:52.415918" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:52.415683" 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-11T00:49:52.416338" 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-11T00:49:52.416611" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:52.416463" 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-11T00:49:52.416830" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:52.416692" elapsed="0.000191"/>
</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-11T00:49:52.417044" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:52.416905" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:52.416443" elapsed="0.000675"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:52.416174" elapsed="0.000968"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:52.415989" elapsed="0.001188"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:52.417217" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:49:52.417431" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:52.417479" 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-11T00:49:52.412045" elapsed="0.005457"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:52.417943" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:52.418019" 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-11T00:49:52.417672" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:52.418841" 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-11T00:49:52.418550" elapsed="0.000374">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:52.418283" elapsed="0.000711">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:52.418092" 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-11T00:49:52.419238" 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-11T00:49:52.419426" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:52.419493" elapsed="0.000015"/>
</return>
<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>
<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-11T00:49:52.409561" elapsed="0.010038">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:52.409310" elapsed="0.010358">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:52.409168" elapsed="0.010555">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:52.408776" elapsed="0.011034">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:52.420040" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:52.383147" elapsed="0.037009">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:53.444876" elapsed="0.000245"/>
</kw>
<msg time="2026-04-11T00:49:53.445192" 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-11T00:49:53.444210" elapsed="0.001051"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:53.443756" elapsed="0.001584"/>
</kw>
<msg time="2026-04-11T00:49:53.445399" 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-11T00:49:53.435686" elapsed="0.009760"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:53.435255" elapsed="0.010266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:53.445973" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:53.445714" elapsed="0.000316"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:53.451198" 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-11T00:49:53.450811" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:53.451683" 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-11T00:49:53.451396" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:53.451757" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:49:53.451916" 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-11T00:49:53.450443" elapsed="0.001498"/>
</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-11T00:49:53.452092" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:53.452750" level="INFO">${ds_type} = operational</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-11T00:49:53.452419" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:53.453168" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:53.452933" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:53.453590" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:53.453338" 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-11T00:49:53.454031" 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-11T00:49:53.454368" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:53.454219" elapsed="0.000221"/>
</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-11T00:49:53.454606" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:53.454465" 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-11T00:49:53.454825" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:53.454685" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:53.454198" elapsed="0.000701"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:53.453841" elapsed="0.001081"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:53.453662" elapsed="0.001287"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:53.454988" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:49:53.455190" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:53.455236" 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-11T00:49:53.449716" elapsed="0.005542"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:53.455712" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:53.455789" 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-11T00:49:53.455442" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:53.456373" 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-11T00:49:53.456092" elapsed="0.000372">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:53.455879" elapsed="0.000652">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:53.455862" elapsed="0.000700">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-11T00:49:53.456712" 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-11T00:49:53.456883" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:53.456948" elapsed="0.000015"/>
</return>
<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>
<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-11T00:49:53.447055" elapsed="0.009998">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:53.446815" elapsed="0.010307">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:53.446670" elapsed="0.010507">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:53.446257" elapsed="0.011009">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:53.457512" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:53.421040" elapsed="0.036587">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:54.481312" elapsed="0.000307"/>
</kw>
<msg time="2026-04-11T00:49:54.481699" 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-11T00:49:54.480624" elapsed="0.001143"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:54.480103" elapsed="0.001750"/>
</kw>
<msg time="2026-04-11T00:49:54.481904" 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-11T00:49:54.471911" elapsed="0.010037"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:54.471372" elapsed="0.010648"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:54.482604" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:54.482311" elapsed="0.000342"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:54.488072" 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-11T00:49:54.487676" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:54.488569" 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-11T00:49:54.488267" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:54.488643" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:49:54.488800" 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-11T00:49:54.487279" elapsed="0.001545"/>
</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-11T00:49:54.488974" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:54.489652" level="INFO">${ds_type} = operational</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-11T00:49:54.489293" elapsed="0.000386"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:54.490078" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:54.489837" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:54.490581" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:54.490264" elapsed="0.000354"/>
</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-11T00:49:54.491183" elapsed="0.000030"/>
</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-11T00:49:54.491523" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:54.491310" elapsed="0.000284"/>
</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-11T00:49:54.491817" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:54.491633" elapsed="0.000257"/>
</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-11T00:49:54.492104" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:54.491921" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:54.491287" elapsed="0.000909"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:54.490947" elapsed="0.001280"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:54.490686" elapsed="0.001573"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:54.492308" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:49:54.492573" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:54.492630" 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-11T00:49:54.486532" elapsed="0.006128"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:54.493219" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:54.493312" 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-11T00:49:54.492884" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:54.494359" 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-11T00:49:54.493756" elapsed="0.000732">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:54.493444" elapsed="0.001129">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:54.493421" elapsed="0.001195">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-11T00:49:54.494814" 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-11T00:49:54.495036" elapsed="0.000025"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:54.495116" elapsed="0.000019"/>
</return>
<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>
<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-11T00:49:54.483703" elapsed="0.011618">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:54.483465" elapsed="0.011966">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:54.483298" elapsed="0.012206">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:54.482899" elapsed="0.012718">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:54.495922" elapsed="0.000031"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:54.458367" elapsed="0.037703">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:55.524246" elapsed="0.000260"/>
</kw>
<msg time="2026-04-11T00:49:55.524578" 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-11T00:49:55.523585" elapsed="0.001060"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:55.523020" elapsed="0.001706"/>
</kw>
<msg time="2026-04-11T00:49:55.524773" 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-11T00:49:55.513183" elapsed="0.011635"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:55.512594" elapsed="0.012298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:55.525370" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:55.525107" elapsed="0.000325"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:55.530634" 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-11T00:49:55.530087" elapsed="0.000573"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:55.531110" 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-11T00:49:55.530819" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:55.531183" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:49:55.531341" 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-11T00:49:55.529714" elapsed="0.001652"/>
</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-11T00:49:55.531571" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:55.532232" level="INFO">${ds_type} = operational</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-11T00:49:55.531893" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:55.532881" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:55.532432" elapsed="0.000486"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:55.533359" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:55.533108" elapsed="0.000294"/>
</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-11T00:49:55.533804" 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-11T00:49:55.534067" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:55.533916" elapsed="0.000208"/>
</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-11T00:49:55.534291" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:55.534149" elapsed="0.000284"/>
</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-11T00:49:55.534607" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:55.534459" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:55.533896" elapsed="0.000788"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:55.533636" elapsed="0.001072"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:55.533451" elapsed="0.001284"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:55.534774" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:49:55.534975" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:55.535021" 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-11T00:49:55.528938" elapsed="0.006107"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:55.535511" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:55.535588" 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-11T00:49:55.535217" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:55.536186" 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-11T00:49:55.535903" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:55.535683" elapsed="0.000644">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:55.535665" elapsed="0.000694">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-11T00:49:55.536530" 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-11T00:49:55.536704" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:55.536771" elapsed="0.000015"/>
</return>
<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>
<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-11T00:49:55.526462" elapsed="0.010419">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:55.526208" elapsed="0.010746">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:55.526063" elapsed="0.010967">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:55.525662" elapsed="0.011460">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:55.537354" elapsed="0.000039"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:55.497059" elapsed="0.040429">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:56.563426" elapsed="0.000250"/>
</kw>
<msg time="2026-04-11T00:49:56.563755" 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-11T00:49:56.562751" elapsed="0.001072"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:56.562259" elapsed="0.001648"/>
</kw>
<msg time="2026-04-11T00:49:56.563954" 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-11T00:49:56.553951" elapsed="0.010048"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:56.553523" elapsed="0.010551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:56.564576" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:56.564278" elapsed="0.000345"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:56.570214" 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-11T00:49:56.569822" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:56.570713" 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-11T00:49:56.570419" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:56.570789" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:49:56.570949" 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-11T00:49:56.569446" elapsed="0.001528"/>
</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-11T00:49:56.571127" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:56.571804" level="INFO">${ds_type} = operational</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-11T00:49:56.571465" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:56.572229" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:56.571989" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:56.572746" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:56.572420" elapsed="0.000353"/>
</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-11T00:49:56.573195" 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-11T00:49:56.573496" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:56.573310" elapsed="0.000248"/>
</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-11T00:49:56.573728" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:56.573584" elapsed="0.000198"/>
</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-11T00:49:56.573947" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:56.573805" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:56.573290" elapsed="0.000731"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:56.573002" elapsed="0.001043"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:56.572820" elapsed="0.001250"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:56.574109" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:49:56.574311" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:56.574358" 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-11T00:49:56.568648" elapsed="0.005747"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:56.574844" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:56.574921" 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-11T00:49:56.574569" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:56.575532" 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-11T00:49:56.575232" elapsed="0.000373">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:56.575014" elapsed="0.000660">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:56.574996" elapsed="0.000709">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-11T00:49:56.575858" 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-11T00:49:56.576030" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:56.576094" elapsed="0.000016"/>
</return>
<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>
<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-11T00:49:56.565822" elapsed="0.010380">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:56.565586" elapsed="0.010685">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:56.565434" elapsed="0.010892">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:56.564855" elapsed="0.011657">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:56.576756" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:56.538490" elapsed="0.038383">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:57.602705" elapsed="0.000239"/>
</kw>
<msg time="2026-04-11T00:49:57.603011" 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-11T00:49:57.602044" elapsed="0.001035"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:57.601582" elapsed="0.001589"/>
</kw>
<msg time="2026-04-11T00:49:57.603220" 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-11T00:49:57.593359" elapsed="0.009906"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:57.592942" elapsed="0.010397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:57.603814" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:57.603552" elapsed="0.000308"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:57.609097" 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-11T00:49:57.608582" elapsed="0.000545"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:57.609608" 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-11T00:49:57.609292" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:57.609684" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:49:57.609845" 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-11T00:49:57.608191" elapsed="0.001679"/>
</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-11T00:49:57.610026" elapsed="0.000161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:57.610706" level="INFO">${ds_type} = operational</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-11T00:49:57.610348" elapsed="0.000385"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:57.611180" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:57.610890" elapsed="0.000317"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:57.611613" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:57.611356" elapsed="0.000283"/>
</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-11T00:49:57.612068" elapsed="0.000026"/>
</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-11T00:49:57.612330" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:57.612180" elapsed="0.000220"/>
</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-11T00:49:57.612621" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:57.612445" elapsed="0.000236"/>
</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-11T00:49:57.612847" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:57.612706" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:57.612161" elapsed="0.000758"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:57.611871" elapsed="0.001073"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:57.611686" elapsed="0.001360"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:57.613090" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:49:57.613294" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:57.613339" 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-11T00:49:57.607463" elapsed="0.005899"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:57.613822" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:57.613899" 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-11T00:49:57.613551" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:57.614699" 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-11T00:49:57.614206" elapsed="0.000569">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:57.613990" elapsed="0.000855">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:57.613972" elapsed="0.000906">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-11T00:49:57.615031" 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-11T00:49:57.615204" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:57.615269" elapsed="0.000016"/>
</return>
<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>
<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-11T00:49:57.604893" elapsed="0.010483">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:57.604663" elapsed="0.010801">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:57.604521" elapsed="0.010999">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:57.604107" elapsed="0.011502">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:57.615838" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:57.577890" elapsed="0.038077">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:58.643273" elapsed="0.000289"/>
</kw>
<msg time="2026-04-11T00:49:58.643645" 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-11T00:49:58.642610" elapsed="0.001104"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:58.642015" elapsed="0.001783"/>
</kw>
<msg time="2026-04-11T00:49:58.643875" 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-11T00:49:58.633729" elapsed="0.010200"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:58.633236" elapsed="0.010775"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:58.644489" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:58.644205" elapsed="0.000332"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:58.649586" 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-11T00:49:58.649182" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:58.650061" 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-11T00:49:58.649775" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:58.650221" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:49:58.650399" 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-11T00:49:58.648796" elapsed="0.001630"/>
</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-11T00:49:58.650581" elapsed="0.000161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:58.651486" level="INFO">${ds_type} = operational</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-11T00:49:58.650907" elapsed="0.000607"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:58.651925" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:58.651677" elapsed="0.000274"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:58.652341" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:58.652101" elapsed="0.000266"/>
</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-11T00:49:58.652790" 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-11T00:49:58.653051" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:58.652900" elapsed="0.000207"/>
</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-11T00:49:58.653274" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:58.653133" 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-11T00:49:58.653513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:58.653353" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:58.652881" elapsed="0.000709"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:58.652620" elapsed="0.000995"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:58.652432" elapsed="0.001210"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:58.653682" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:49:58.653884" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:58.653930" 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-11T00:49:58.648077" elapsed="0.005878"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:58.654411" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:58.654492" 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-11T00:49:58.654125" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:58.655101" 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-11T00:49:58.654803" elapsed="0.000372">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:58.654586" elapsed="0.000659">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:58.654567" 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-11T00:49:58.655471" elapsed="0.000025"/>
</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-11T00:49:58.655651" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:58.655719" elapsed="0.000015"/>
</return>
<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>
<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-11T00:49:58.645564" elapsed="0.010259">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:58.645312" elapsed="0.010578">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:58.645168" elapsed="0.010777">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:58.644770" elapsed="0.011263">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:58.656263" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:58.616919" elapsed="0.039513">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:49:59.681815" elapsed="0.000252"/>
</kw>
<msg time="2026-04-11T00:49:59.682138" 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-11T00:49:59.681150" elapsed="0.001055"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:59.680687" elapsed="0.001599"/>
</kw>
<msg time="2026-04-11T00:49:59.682332" 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-11T00:49:59.671845" elapsed="0.010531"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:49:59.671367" elapsed="0.011101"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:49:59.682928" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:49:59.682665" elapsed="0.000343"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:49:59.688521" 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-11T00:49:59.688084" elapsed="0.000465"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:59.689036" 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-11T00:49:59.688732" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:49:59.689113" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:49:59.689277" 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-11T00:49:59.687710" elapsed="0.001592"/>
</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-11T00:49:59.689541" elapsed="0.000194"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:49:59.690255" level="INFO">${ds_type} = operational</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-11T00:49:59.689909" elapsed="0.000373"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:59.690767" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:59.690457" elapsed="0.000342"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:49:59.691233" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:49:59.690982" 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-11T00:49:59.691716" 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-11T00:49:59.692005" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:59.691852" elapsed="0.000210"/>
</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-11T00:49:59.692247" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:59.692087" elapsed="0.000223"/>
</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-11T00:49:59.692494" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:49:59.692334" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:49:59.691830" elapsed="0.000741"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:49:59.691547" elapsed="0.001047"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:59.691335" elapsed="0.001286"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:49:59.692662" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:49:59.692888" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:49:59.692936" 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-11T00:49:59.686981" elapsed="0.005994"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:49:59.693542" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:49:59.693622" 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-11T00:49:59.693243" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:49:59.694314" 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-11T00:49:59.693970" elapsed="0.000441">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:49:59.693717" elapsed="0.000765">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:49:59.693698" elapsed="0.000818">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-11T00:49:59.694670" elapsed="0.000023"/>
</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-11T00:49:59.694846" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:49:59.694914" elapsed="0.000031"/>
</return>
<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>
<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-11T00:49:59.684079" elapsed="0.010962">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:49:59.683828" elapsed="0.011284">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:49:59.683676" elapsed="0.011492">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:49:59.683252" elapsed="0.012006">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:49:59.695509" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:59.657366" elapsed="0.038259">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:00.721205" elapsed="0.000280"/>
</kw>
<msg time="2026-04-11T00:50:00.721571" 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-11T00:50:00.720522" elapsed="0.001128"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:00.720042" elapsed="0.001689"/>
</kw>
<msg time="2026-04-11T00:50:00.721777" 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-11T00:50:00.711901" elapsed="0.009921"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:00.711414" elapsed="0.010482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:00.722366" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:00.722106" elapsed="0.000344"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:00.727487" 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-11T00:50:00.727079" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:00.727961" 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-11T00:50:00.727674" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:00.728037" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:50:00.728200" 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-11T00:50:00.726706" elapsed="0.001519"/>
</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-11T00:50:00.728376" elapsed="0.000172"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:00.729039" level="INFO">${ds_type} = operational</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-11T00:50:00.728704" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:00.729616" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:00.729357" elapsed="0.000285"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:00.730030" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:00.729791" elapsed="0.000265"/>
</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-11T00:50:00.730494" 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-11T00:50:00.730761" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:00.730610" elapsed="0.000208"/>
</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-11T00:50:00.730984" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:00.730844" 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-11T00:50:00.731203" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:00.731062" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:00.730589" elapsed="0.000689"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:00.730287" elapsed="0.001014"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:00.730103" elapsed="0.001225"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:00.731368" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:50:00.731587" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:00.731647" 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-11T00:50:00.725969" elapsed="0.005709"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:00.732136" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:00.732213" 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-11T00:50:00.731860" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:00.733009" 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-11T00:50:00.732713" elapsed="0.000383">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:00.732304" elapsed="0.000865">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:00.732286" elapsed="0.000915">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-11T00:50:00.733351" 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-11T00:50:00.733539" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:00.733605" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:00.723504" elapsed="0.010210">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:00.723244" elapsed="0.010538">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:00.723090" elapsed="0.010747">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:00.722685" elapsed="0.011239">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:00.734152" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:00.696765" elapsed="0.037500">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:01.760178" elapsed="0.000257"/>
</kw>
<msg time="2026-04-11T00:50:01.760503" 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-11T00:50:01.759533" elapsed="0.001035"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:01.758924" elapsed="0.001823"/>
</kw>
<msg time="2026-04-11T00:50:01.760794" 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-11T00:50:01.750858" elapsed="0.009981"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:01.750442" elapsed="0.010470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:01.761364" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:01.761105" elapsed="0.000323"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:01.766632" 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-11T00:50:01.766229" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:01.767106" 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-11T00:50:01.766819" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:01.767179" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:01.767335" 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-11T00:50:01.765807" elapsed="0.001552"/>
</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-11T00:50:01.767529" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:01.768168" level="INFO">${ds_type} = operational</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-11T00:50:01.767837" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:01.768617" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:01.768363" elapsed="0.000280"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:01.769023" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:01.768788" elapsed="0.000261"/>
</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-11T00:50:01.769453" 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-11T00:50:01.769708" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:01.769562" 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-11T00:50:01.769943" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:01.769786" elapsed="0.000212"/>
</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-11T00:50:01.770162" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:01.770022" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:01.769543" elapsed="0.000691"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:01.769272" elapsed="0.000985"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:01.769094" elapsed="0.001188"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:01.770321" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:01.770532" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:01.770578" 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-11T00:50:01.765087" elapsed="0.005517"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:01.771045" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:01.771122" 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-11T00:50:01.770777" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:01.771722" 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-11T00:50:01.771441" elapsed="0.000352">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:01.771214" elapsed="0.000683">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:01.771196" elapsed="0.000734">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-11T00:50:01.772081" 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-11T00:50:01.772253" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:01.772318" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:01.762471" elapsed="0.009970">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:01.762222" elapsed="0.010290">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:01.762081" elapsed="0.010487">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:01.761655" elapsed="0.011003">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:01.772900" elapsed="0.000029"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:01.735143" elapsed="0.037881">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:02.798045" elapsed="0.000246"/>
</kw>
<msg time="2026-04-11T00:50:02.798363" 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-11T00:50:02.797377" elapsed="0.001071"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:02.796922" elapsed="0.001608"/>
</kw>
<msg time="2026-04-11T00:50:02.798577" 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-11T00:50:02.788452" elapsed="0.010169"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:02.788024" elapsed="0.010669"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:02.799143" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:02.798887" elapsed="0.000300"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:02.804216" 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-11T00:50:02.803809" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:02.804705" 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-11T00:50:02.804418" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:02.804778" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:02.804935" 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-11T00:50:02.803426" elapsed="0.001533"/>
</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-11T00:50:02.805109" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:02.805848" level="INFO">${ds_type} = operational</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-11T00:50:02.805494" elapsed="0.000387"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:02.806282" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:02.806044" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:02.806706" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:02.806470" elapsed="0.000261"/>
</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-11T00:50:02.807201" elapsed="0.000026"/>
</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-11T00:50:02.807476" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:02.807312" elapsed="0.000221"/>
</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-11T00:50:02.807698" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:02.807558" elapsed="0.000194"/>
</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-11T00:50:02.807913" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:02.807774" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:02.807293" elapsed="0.000692"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:02.806955" elapsed="0.001054"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:02.806776" elapsed="0.001259"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:02.808075" elapsed="0.000026"/>
</return>
<msg time="2026-04-11T00:50:02.808272" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:02.808317" 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-11T00:50:02.802664" elapsed="0.005676"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:02.808793" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:02.808868" 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-11T00:50:02.808523" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:02.811225" 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-11T00:50:02.810933" elapsed="0.000363">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:02.810701" elapsed="0.000661">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:02.808941" elapsed="0.002471">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-11T00:50:02.811567" 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-11T00:50:02.811740" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:02.811805" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:02.800195" elapsed="0.011715">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:02.799963" elapsed="0.012017">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:02.799821" elapsed="0.012214">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:02.799427" elapsed="0.012703">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:02.812359" elapsed="0.000039"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:02.774018" elapsed="0.038473">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:03.836837" elapsed="0.000262"/>
</kw>
<msg time="2026-04-11T00:50:03.837168" 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-11T00:50:03.836175" elapsed="0.001060"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:03.835712" elapsed="0.001602"/>
</kw>
<msg time="2026-04-11T00:50:03.837359" 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-11T00:50:03.827637" elapsed="0.009782"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:03.827197" elapsed="0.010386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:03.838034" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:03.837774" elapsed="0.000306"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:03.843259" 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-11T00:50:03.842868" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:03.843746" 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-11T00:50:03.843459" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:03.843818" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:03.844009" 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-11T00:50:03.842498" elapsed="0.001539"/>
</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-11T00:50:03.844193" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:03.844853" level="INFO">${ds_type} = operational</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-11T00:50:03.844521" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:03.845349" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:03.845089" elapsed="0.000287"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:03.845778" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:03.845541" 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-11T00:50:03.846199" 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-11T00:50:03.846469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:03.846305" elapsed="0.000220"/>
</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-11T00:50:03.846690" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:03.846551" 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-11T00:50:03.846907" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:03.846767" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:03.846286" elapsed="0.000694"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:03.846032" elapsed="0.000973"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:03.845849" elapsed="0.001198"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:03.847087" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:03.847285" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:03.847330" 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-11T00:50:03.841771" elapsed="0.005582"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:03.847812" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:03.847886" 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-11T00:50:03.847541" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:03.848498" 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-11T00:50:03.848192" elapsed="0.000382">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:03.847978" elapsed="0.000664">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:03.847960" elapsed="0.000714">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-11T00:50:03.848825" 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-11T00:50:03.849021" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:03.849129" elapsed="0.000017"/>
</return>
<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>
<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-11T00:50:03.839093" elapsed="0.010145">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:03.838859" elapsed="0.010447">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:03.838718" elapsed="0.010642">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:03.838306" elapsed="0.011161">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:03.849701" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:03.813600" elapsed="0.036217">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:04.875418" elapsed="0.000252"/>
</kw>
<msg time="2026-04-11T00:50:04.875741" 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-11T00:50:04.874743" elapsed="0.001066"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:04.874246" elapsed="0.001644"/>
</kw>
<msg time="2026-04-11T00:50:04.875937" 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-11T00:50:04.866028" elapsed="0.009953"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:04.865572" elapsed="0.010483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:04.876533" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:04.876251" elapsed="0.000327"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:04.881600" 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-11T00:50:04.881195" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:04.882096" 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-11T00:50:04.881802" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:04.882170" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:50:04.882331" 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-11T00:50:04.880823" elapsed="0.001532"/>
</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-11T00:50:04.882524" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:04.883173" level="INFO">${ds_type} = operational</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-11T00:50:04.882841" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:04.883609" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:04.883355" elapsed="0.000280"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:04.884014" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:04.883781" elapsed="0.000258"/>
</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-11T00:50:04.884473" 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-11T00:50:04.884730" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:04.884582" elapsed="0.000276"/>
</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-11T00:50:04.885031" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:04.884886" elapsed="0.000203"/>
</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-11T00:50:04.885253" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:04.885112" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:04.884563" elapsed="0.000764"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:04.884268" elapsed="0.001084"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:04.884085" elapsed="0.001293"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:04.885435" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:04.885636" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:04.885681" 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-11T00:50:04.880088" elapsed="0.005616"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:04.886145" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:04.886222" 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-11T00:50:04.885874" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:04.887022" 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-11T00:50:04.886547" elapsed="0.000548">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:04.886315" elapsed="0.000850">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:04.886297" elapsed="0.000899">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-11T00:50:04.887350" 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-11T00:50:04.887542" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:04.887620" elapsed="0.000018"/>
</return>
<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>
<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-11T00:50:04.877598" elapsed="0.010133">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:04.877339" elapsed="0.010462">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:04.877197" elapsed="0.010659">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:04.876804" elapsed="0.011142">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:04.888177" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:04.850790" elapsed="0.037503">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:05.916580" elapsed="0.000246"/>
</kw>
<msg time="2026-04-11T00:50:05.916895" 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-11T00:50:05.915917" elapsed="0.001046"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:05.915434" elapsed="0.001609"/>
</kw>
<msg time="2026-04-11T00:50:05.917088" 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-11T00:50:05.907250" elapsed="0.009882"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:05.906829" elapsed="0.010421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:05.917722" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:05.917459" elapsed="0.000309"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:05.923741" 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-11T00:50:05.923326" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:05.924251" 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-11T00:50:05.923954" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:05.924326" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:05.924535" 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-11T00:50:05.922955" elapsed="0.001607"/>
</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-11T00:50:05.924717" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:05.925475" level="INFO">${ds_type} = operational</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-11T00:50:05.925121" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:05.926102" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:05.925659" elapsed="0.000470"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:05.926538" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:05.926278" elapsed="0.000286"/>
</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-11T00:50:05.926957" 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-11T00:50:05.927219" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:05.927067" elapsed="0.000207"/>
</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-11T00:50:05.927452" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:05.927299" elapsed="0.000208"/>
</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-11T00:50:05.927671" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:05.927530" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:05.927046" elapsed="0.000697"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:05.926792" elapsed="0.000975"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:05.926611" elapsed="0.001182"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:05.927832" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:05.928070" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:05.928116" 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-11T00:50:05.922184" elapsed="0.005955"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:05.928603" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:05.928680" 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-11T00:50:05.928312" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:05.929403" 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-11T00:50:05.929072" elapsed="0.000408">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:05.928772" elapsed="0.000776">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:05.928755" elapsed="0.000825">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-11T00:50:05.929733" elapsed="0.000023"/>
</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-11T00:50:05.929950" elapsed="0.000025"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:05.930023" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:05.919002" elapsed="0.011133">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:05.918769" elapsed="0.011493">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:05.918628" elapsed="0.011693">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:05.918211" elapsed="0.012218">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:05.930665" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:05.889131" elapsed="0.041650">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:06.955813" elapsed="0.000266"/>
</kw>
<msg time="2026-04-11T00:50:06.956149" 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-11T00:50:06.955050" elapsed="0.001165"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:06.954572" elapsed="0.001738"/>
</kw>
<msg time="2026-04-11T00:50:06.956355" 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-11T00:50:06.946052" elapsed="0.010378"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:06.945625" elapsed="0.010882"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:06.956970" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:06.956708" elapsed="0.000308"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:06.962433" 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-11T00:50:06.962022" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:06.962915" 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-11T00:50:06.962624" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:06.962990" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:06.963150" 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-11T00:50:06.961645" elapsed="0.001530"/>
</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-11T00:50:06.963328" elapsed="0.000188"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:06.964017" level="INFO">${ds_type} = operational</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-11T00:50:06.963675" elapsed="0.000369"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:06.964461" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:06.964202" elapsed="0.000286"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:06.964876" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:06.964636" elapsed="0.000266"/>
</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-11T00:50:06.965303" 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-11T00:50:06.965576" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:06.965427" elapsed="0.000206"/>
</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-11T00:50:06.965799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:06.965658" 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-11T00:50:06.966020" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:06.965877" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:06.965407" elapsed="0.000757"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:06.965135" elapsed="0.001055"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:06.964949" elapsed="0.001266"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:06.966255" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:50:06.966479" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:06.966527" 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-11T00:50:06.960893" elapsed="0.005658"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:06.967004" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:06.967084" 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-11T00:50:06.966724" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:06.967719" 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-11T00:50:06.967433" elapsed="0.000363">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:06.967184" elapsed="0.000685">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:06.967166" elapsed="0.000736">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-11T00:50:06.968056" 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-11T00:50:06.968230" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:06.968298" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:06.958092" elapsed="0.010332">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:06.957833" elapsed="0.010665">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:06.957691" elapsed="0.010863">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:06.957245" elapsed="0.011402">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:06.968883" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:06.931679" elapsed="0.037322">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:07.995191" elapsed="0.000267"/>
</kw>
<msg time="2026-04-11T00:50:07.995529" 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-11T00:50:07.994504" elapsed="0.001091"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:07.994013" elapsed="0.001660"/>
</kw>
<msg time="2026-04-11T00:50:07.995719" 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-11T00:50:07.985319" elapsed="0.010444"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:07.984720" elapsed="0.011117"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:07.996289" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:07.996031" elapsed="0.000303"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:08.001313" 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-11T00:50:08.000920" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:08.001942" 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-11T00:50:08.001642" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:08.002018" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:50:08.002183" 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-11T00:50:08.000549" elapsed="0.001659"/>
</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-11T00:50:08.002359" elapsed="0.000176"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:08.003042" level="INFO">${ds_type} = operational</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-11T00:50:08.002694" elapsed="0.000375"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:08.003479" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:08.003224" elapsed="0.000281"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:08.003887" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:08.003651" elapsed="0.000261"/>
</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-11T00:50:08.004351" 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-11T00:50:08.004622" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:08.004474" 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-11T00:50:08.004841" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:08.004700" 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-11T00:50:08.005055" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:08.004916" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:08.004455" elapsed="0.000677"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:08.004165" elapsed="0.000990"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:08.003960" elapsed="0.001220"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:08.005219" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:08.005430" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:08.005477" 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-11T00:50:07.999830" elapsed="0.005669"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:08.005935" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:08.006011" 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-11T00:50:08.005668" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:08.006801" 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-11T00:50:08.006516" elapsed="0.000357">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:08.006102" elapsed="0.000854">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:08.006084" elapsed="0.000904">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-11T00:50:08.007144" 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-11T00:50:08.007315" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:08.007393" elapsed="0.000017"/>
</return>
<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>
<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-11T00:50:07.997340" elapsed="0.010162">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:07.997110" elapsed="0.010462">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:07.996970" elapsed="0.010656">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:07.996576" elapsed="0.011138">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:08.007942" elapsed="0.000060"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:07.969853" elapsed="0.038244">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:09.035185" elapsed="0.000254"/>
</kw>
<msg time="2026-04-11T00:50:09.035509" 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-11T00:50:09.034542" elapsed="0.001033"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:09.034051" elapsed="0.001603"/>
</kw>
<msg time="2026-04-11T00:50:09.035700" 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-11T00:50:09.026018" elapsed="0.009726"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:09.025601" elapsed="0.010216"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:09.036260" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:09.036005" elapsed="0.000300"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:09.041426" 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-11T00:50:09.041028" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:09.041900" 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-11T00:50:09.041616" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:09.041974" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:09.042129" 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-11T00:50:09.040664" elapsed="0.001489"/>
</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-11T00:50:09.042303" elapsed="0.000185"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:09.042976" level="INFO">${ds_type} = operational</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-11T00:50:09.042646" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:09.043408" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:09.043158" elapsed="0.000277"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:09.043815" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:09.043580" elapsed="0.000261"/>
</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-11T00:50:09.044233" 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-11T00:50:09.044502" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:09.044338" elapsed="0.000220"/>
</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-11T00:50:09.044728" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:09.044585" 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-11T00:50:09.044944" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:09.044804" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:09.044320" elapsed="0.000698"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:09.044064" elapsed="0.000977"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:09.043887" elapsed="0.001179"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:09.045104" elapsed="0.000026"/>
</return>
<msg time="2026-04-11T00:50:09.045298" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:09.045343" 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-11T00:50:09.039939" elapsed="0.005427"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:09.045889" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:09.045966" 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-11T00:50:09.045621" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:09.046594" 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-11T00:50:09.046273" elapsed="0.000391">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:09.046059" elapsed="0.000672">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:09.046041" elapsed="0.000722">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-11T00:50:09.046917" 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-11T00:50:09.047091" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:09.047157" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:09.037308" elapsed="0.009953">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:09.037076" elapsed="0.010255">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:09.036937" elapsed="0.010463">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:09.036545" elapsed="0.010949">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:09.047726" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:09.009049" elapsed="0.038793">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:10.074964" elapsed="0.000240"/>
</kw>
<msg time="2026-04-11T00:50:10.075275" 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-11T00:50:10.074294" elapsed="0.001045"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:10.073791" elapsed="0.001643"/>
</kw>
<msg time="2026-04-11T00:50:10.075481" 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-11T00:50:10.065353" elapsed="0.010172"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:10.064942" elapsed="0.010657"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:10.076044" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:10.075791" elapsed="0.000297"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:10.081043" 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-11T00:50:10.080661" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:10.081531" 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-11T00:50:10.081230" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:10.081604" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:10.081763" 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-11T00:50:10.080279" 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-11T00:50:10.082036" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:10.082707" level="INFO">${ds_type} = operational</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-11T00:50:10.082357" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:10.083128" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:10.082892" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:10.083548" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:10.083297" elapsed="0.000276"/>
</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-11T00:50:10.083960" 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-11T00:50:10.084216" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:10.084069" 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-11T00:50:10.084450" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:10.084296" elapsed="0.000208"/>
</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-11T00:50:10.084667" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:10.084527" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:10.084050" elapsed="0.000689"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:10.083798" elapsed="0.000966"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:10.083619" elapsed="0.001172"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:10.084830" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:10.085027" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:10.085072" 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-11T00:50:10.079578" elapsed="0.005516"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:10.085715" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:10.085793" 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-11T00:50:10.085261" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:10.086422" 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-11T00:50:10.086123" elapsed="0.000373">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:10.085885" elapsed="0.000678">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:10.085867" elapsed="0.000728">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-11T00:50:10.086745" 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-11T00:50:10.086916" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:10.086980" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:10.077096" elapsed="0.009989">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:10.076861" elapsed="0.010293">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:10.076717" elapsed="0.010491">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:10.076311" elapsed="0.010985">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:10.087539" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:10.048756" elapsed="0.038898">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:11.112424" elapsed="0.000240"/>
</kw>
<msg time="2026-04-11T00:50:11.112738" 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-11T00:50:11.111646" elapsed="0.001159"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:11.111166" elapsed="0.001718"/>
</kw>
<msg time="2026-04-11T00:50:11.112928" 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-11T00:50:11.103008" elapsed="0.009963"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:11.102590" elapsed="0.010452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:11.113566" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:11.113233" elapsed="0.000380"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:11.118752" 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-11T00:50:11.118354" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:11.119222" 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-11T00:50:11.118937" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:11.119296" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:11.119468" 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-11T00:50:11.117988" elapsed="0.001504"/>
</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-11T00:50:11.119643" elapsed="0.000150"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:11.120276" level="INFO">${ds_type} = operational</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-11T00:50:11.119948" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:11.120708" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:11.120471" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:11.121108" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:11.120877" elapsed="0.000256"/>
</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-11T00:50:11.121563" 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-11T00:50:11.121820" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:11.121672" 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-11T00:50:11.122037" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:11.121898" elapsed="0.000192"/>
</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-11T00:50:11.122252" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:11.122114" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:11.121653" elapsed="0.000671"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:11.121357" elapsed="0.000990"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:11.121179" elapsed="0.001193"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:11.122425" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:11.122623" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:11.122668" 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-11T00:50:11.117257" elapsed="0.005433"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:11.123124" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:11.123199" 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-11T00:50:11.122858" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:11.123882" 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-11T00:50:11.123591" elapsed="0.000363">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:11.123333" elapsed="0.000690">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:11.123315" elapsed="0.000739">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-11T00:50:11.124204" 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-11T00:50:11.124374" elapsed="0.000036"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:11.124456" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:11.114624" elapsed="0.009938">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:11.114375" elapsed="0.010256">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:11.114234" elapsed="0.010452">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:11.113841" elapsed="0.010933">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:11.125002" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:11.088617" elapsed="0.036499">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:12.150096" elapsed="0.000237"/>
</kw>
<msg time="2026-04-11T00:50:12.150417" 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-11T00:50:12.149438" elapsed="0.001045"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:12.148820" elapsed="0.001741"/>
</kw>
<msg time="2026-04-11T00:50:12.150606" 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-11T00:50:12.140718" elapsed="0.009931"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:12.140292" elapsed="0.010429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:12.151167" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:12.150913" elapsed="0.000299"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:12.157423" 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-11T00:50:12.156826" elapsed="0.000626"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:12.157896" 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-11T00:50:12.157611" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:12.157970" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:12.158126" 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-11T00:50:12.156295" elapsed="0.001855"/>
</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-11T00:50:12.158301" elapsed="0.000180"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:12.158977" level="INFO">${ds_type} = operational</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-11T00:50:12.158647" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:12.159408" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:12.159157" elapsed="0.000347"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:12.159891" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:12.159654" 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-11T00:50:12.160299" 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-11T00:50:12.160577" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:12.160428" 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-11T00:50:12.160796" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:12.160658" elapsed="0.000190"/>
</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-11T00:50:12.161034" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:12.160871" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:12.160407" elapsed="0.000702"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:12.160137" elapsed="0.000996"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:12.159961" elapsed="0.001197"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:12.161197" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:12.161409" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:12.161456" 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-11T00:50:12.155297" elapsed="0.006182"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:12.161916" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:12.161992" 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-11T00:50:12.161650" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:12.162773" 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-11T00:50:12.162295" elapsed="0.000555">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:12.162082" elapsed="0.000838">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:12.162065" elapsed="0.000886">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-11T00:50:12.163102" 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-11T00:50:12.163273" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:12.163339" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:12.152208" elapsed="0.011255">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:12.151981" elapsed="0.011551">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:12.151842" elapsed="0.011744">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:12.151449" elapsed="0.012227">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:12.163904" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:12.126024" elapsed="0.037994">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:13.189422" elapsed="0.000257"/>
</kw>
<msg time="2026-04-11T00:50:13.189747" 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-11T00:50:13.188440" elapsed="0.001374"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:13.187955" elapsed="0.001937"/>
</kw>
<msg time="2026-04-11T00:50:13.190034" 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-11T00:50:13.179057" elapsed="0.011024"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:13.178499" elapsed="0.011657"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:13.190639" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:13.190356" elapsed="0.000330"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:13.195696" 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-11T00:50:13.195288" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:13.196165" 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-11T00:50:13.195882" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:13.196237" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:13.196407" 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-11T00:50:13.194919" elapsed="0.001514"/>
</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-11T00:50:13.196596" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:13.197241" level="INFO">${ds_type} = operational</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-11T00:50:13.196911" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:13.197879" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:13.197444" elapsed="0.000461"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:13.198300" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:13.198060" elapsed="0.000265"/>
</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-11T00:50:13.198739" 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-11T00:50:13.198994" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:13.198848" 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-11T00:50:13.199214" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:13.199075" 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-11T00:50:13.199446" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:13.199291" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:13.198828" elapsed="0.000694"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:13.198573" elapsed="0.000973"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:13.198376" elapsed="0.001196"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:13.199610" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:13.199809" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:13.199855" 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-11T00:50:13.194187" elapsed="0.005691"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:13.200316" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:13.200407" 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-11T00:50:13.200047" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:13.201009" 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-11T00:50:13.200729" elapsed="0.000367">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:13.200514" elapsed="0.000650">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:13.200495" elapsed="0.000737">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-11T00:50:13.201402" elapsed="0.000023"/>
</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-11T00:50:13.201575" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:13.201645" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:13.191693" elapsed="0.010058">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:13.191463" elapsed="0.010363">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:13.191306" elapsed="0.010576">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:13.190914" elapsed="0.011056">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:13.202197" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:13.164953" elapsed="0.037355">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:14.229263" elapsed="0.000259"/>
</kw>
<msg time="2026-04-11T00:50:14.229591" 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-11T00:50:14.228609" elapsed="0.001048"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:14.228108" elapsed="0.001628"/>
</kw>
<msg time="2026-04-11T00:50:14.229781" 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-11T00:50:14.219874" elapsed="0.009950"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:14.219459" elapsed="0.010438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:14.230352" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:14.230094" elapsed="0.000321"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:14.235670" 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-11T00:50:14.235264" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:14.236166" 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-11T00:50:14.235857" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:14.236240" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:14.236415" 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-11T00:50:14.234891" elapsed="0.001550"/>
</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-11T00:50:14.236594" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:14.237240" level="INFO">${ds_type} = operational</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-11T00:50:14.236907" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:14.237682" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:14.237441" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:14.238092" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:14.237853" elapsed="0.000265"/>
</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-11T00:50:14.238530" 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-11T00:50:14.238857" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:14.238708" 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-11T00:50:14.239078" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:14.238937" 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-11T00:50:14.239297" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:14.239156" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:14.238688" elapsed="0.000684"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:14.238348" elapsed="0.001064"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:14.238165" elapsed="0.001273"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:14.239477" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:14.239678" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:14.239725" 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-11T00:50:14.234164" elapsed="0.005584"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:14.240215" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:14.240293" 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-11T00:50:14.239918" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:14.240903" 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-11T00:50:14.240624" elapsed="0.000349">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:14.240401" elapsed="0.000638">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:14.240368" elapsed="0.000703">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-11T00:50:14.241223" 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-11T00:50:14.241411" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:14.241480" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:14.231428" elapsed="0.010157">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:14.231182" elapsed="0.010474">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:14.231041" elapsed="0.010672">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:14.230645" elapsed="0.011159">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:14.242039" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:14.203161" elapsed="0.038993">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:15.270498" elapsed="0.000243"/>
</kw>
<msg time="2026-04-11T00:50:15.270808" 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-11T00:50:15.269820" elapsed="0.001051"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:15.269329" elapsed="0.001621"/>
</kw>
<msg time="2026-04-11T00:50:15.270997" 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-11T00:50:15.259661" elapsed="0.011381"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:15.259059" elapsed="0.012057"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:15.271685" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:15.271406" elapsed="0.000325"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:15.276735" 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-11T00:50:15.276333" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:15.277203" 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-11T00:50:15.276922" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:15.277275" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:15.277450" 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-11T00:50:15.275966" elapsed="0.001508"/>
</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-11T00:50:15.277624" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:15.278260" level="INFO">${ds_type} = operational</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-11T00:50:15.277931" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:15.278692" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:15.278455" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:15.279147" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:15.278894" elapsed="0.000280"/>
</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-11T00:50:15.279848" elapsed="0.000053"/>
</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-11T00:50:15.280199" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:15.280021" elapsed="0.000238"/>
</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-11T00:50:15.280452" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:15.280290" elapsed="0.000224"/>
</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-11T00:50:15.280689" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:15.280539" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:15.279997" elapsed="0.000765"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:15.279421" elapsed="0.001364"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:15.279222" elapsed="0.001588"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:15.280847" elapsed="0.000038"/>
</return>
<msg time="2026-04-11T00:50:15.281064" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:15.281110" 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-11T00:50:15.275222" elapsed="0.005911"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:15.281742" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:15.281832" 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-11T00:50:15.281302" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:15.282658" 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-11T00:50:15.282151" elapsed="0.000591">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:15.281932" elapsed="0.000880">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:15.281913" elapsed="0.000932">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-11T00:50:15.282997" 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-11T00:50:15.283168" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:15.283232" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:15.272744" elapsed="0.010629">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:15.272512" elapsed="0.010949">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:15.272353" elapsed="0.011177">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:15.271956" elapsed="0.011673">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:15.283867" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:15.243051" elapsed="0.040931">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:16.308457" elapsed="0.000254"/>
</kw>
<msg time="2026-04-11T00:50:16.308783" 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-11T00:50:16.307796" elapsed="0.001054"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:16.307313" elapsed="0.001617"/>
</kw>
<msg time="2026-04-11T00:50:16.308976" 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-11T00:50:16.298837" elapsed="0.010183"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:16.298202" elapsed="0.010890"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:16.309559" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:16.309284" elapsed="0.000320"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:16.314644" 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-11T00:50:16.314243" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:16.315130" 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-11T00:50:16.314830" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:16.315205" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:16.315365" 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-11T00:50:16.313875" elapsed="0.001529"/>
</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-11T00:50:16.315558" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:16.316427" level="INFO">${ds_type} = operational</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-11T00:50:16.315869" elapsed="0.000587"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:16.316856" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:16.316615" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:16.317264" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:16.317028" 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-11T00:50:16.317699" 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-11T00:50:16.317960" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:16.317810" 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-11T00:50:16.318179" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:16.318040" elapsed="0.000269"/>
</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-11T00:50:16.318491" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:16.318333" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:16.317790" elapsed="0.000776"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:16.317533" elapsed="0.001057"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:16.317336" elapsed="0.001279"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:16.318654" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:16.318853" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:16.318899" 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-11T00:50:16.313151" elapsed="0.005771"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:16.319372" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:16.319466" 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-11T00:50:16.319103" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:16.320057" 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-11T00:50:16.319774" elapsed="0.000369">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:16.319559" elapsed="0.000653">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:16.319541" elapsed="0.000703">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-11T00:50:16.320411" elapsed="0.000023"/>
</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-11T00:50:16.320587" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:16.320652" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:16.310646" elapsed="0.010112">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:16.310404" elapsed="0.010422">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:16.310242" elapsed="0.010638">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:16.309830" elapsed="0.011137">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:16.321196" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:16.284909" elapsed="0.036400">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:17.345531" elapsed="0.000932"/>
</kw>
<msg time="2026-04-11T00:50:17.346592" 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-11T00:50:17.344860" elapsed="0.001822"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:17.344395" elapsed="0.002560"/>
</kw>
<msg time="2026-04-11T00:50:17.347006" 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-11T00:50:17.336307" elapsed="0.010766"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:17.335896" elapsed="0.011285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:17.347721" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:17.347425" elapsed="0.000342"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:17.353319" 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-11T00:50:17.352906" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:17.353811" 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-11T00:50:17.353523" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:17.353886" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:50:17.354045" 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-11T00:50:17.352538" elapsed="0.001531"/>
</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-11T00:50:17.354219" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:17.354974" level="INFO">${ds_type} = operational</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-11T00:50:17.354546" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:17.355491" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:17.355161" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:17.355914" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:17.355669" elapsed="0.000272"/>
</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-11T00:50:17.356348" 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-11T00:50:17.356623" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:17.356474" 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-11T00:50:17.356881" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:17.356705" elapsed="0.000240"/>
</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-11T00:50:17.357131" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:17.356969" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:17.356454" elapsed="0.000755"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:17.356180" elapsed="0.001053"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:17.355995" elapsed="0.001263"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:17.357297" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:17.357513" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:17.357559" 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-11T00:50:17.351811" elapsed="0.005772"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:17.358020" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:17.358096" 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-11T00:50:17.357752" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:17.358720" 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-11T00:50:17.358416" elapsed="0.000386">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:17.358188" elapsed="0.000682">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:17.358170" elapsed="0.000731">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-11T00:50:17.359050" 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-11T00:50:17.359219" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:17.359285" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:17.348835" elapsed="0.010572">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:17.348593" elapsed="0.010886">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:17.348435" elapsed="0.011099">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:17.348004" elapsed="0.011660">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:17.359898" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:17.322148" elapsed="0.037865">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:18.386838" elapsed="0.000230"/>
</kw>
<msg time="2026-04-11T00:50:18.387132" 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-11T00:50:18.386171" elapsed="0.001022"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:18.385687" elapsed="0.001585"/>
</kw>
<msg time="2026-04-11T00:50:18.387318" 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-11T00:50:18.377709" elapsed="0.009654"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:18.377285" elapsed="0.010170"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:18.387901" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:18.387646" elapsed="0.000299"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:18.392891" 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-11T00:50:18.392508" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:18.393361" 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-11T00:50:18.393076" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:18.393450" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:18.393607" 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-11T00:50:18.392127" elapsed="0.001504"/>
</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-11T00:50:18.393784" elapsed="0.000161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:18.394468" level="INFO">${ds_type} = operational</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-11T00:50:18.394113" elapsed="0.000382"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:18.394888" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:18.394650" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:18.395305" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:18.395057" elapsed="0.000273"/>
</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-11T00:50:18.395731" 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-11T00:50:18.395992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:18.395837" elapsed="0.000210"/>
</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-11T00:50:18.396209" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:18.396072" elapsed="0.000198"/>
</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-11T00:50:18.396446" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:18.396293" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:18.395818" elapsed="0.000710"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:18.395570" elapsed="0.000981"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:18.395374" elapsed="0.001289"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:18.396707" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:50:18.396906" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:18.396952" 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-11T00:50:18.391423" elapsed="0.005552"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:18.397427" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:18.397506" 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-11T00:50:18.397144" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:18.398347" 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-11T00:50:18.397981" elapsed="0.000456">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:18.397760" elapsed="0.000759">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:18.397580" elapsed="0.000971">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-11T00:50:18.398708" 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-11T00:50:18.398879" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:18.398944" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:18.388938" elapsed="0.010117">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:18.388711" elapsed="0.010414">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:18.388572" elapsed="0.010606">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:18.388168" elapsed="0.011098">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:18.399508" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:18.361069" elapsed="0.038555">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:19.424645" elapsed="0.000254"/>
</kw>
<msg time="2026-04-11T00:50:19.424971" 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-11T00:50:19.423961" elapsed="0.001080"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:19.423497" elapsed="0.001625"/>
</kw>
<msg time="2026-04-11T00:50:19.425167" 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-11T00:50:19.415405" elapsed="0.009811"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:19.414945" elapsed="0.010348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:19.425775" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:19.425502" elapsed="0.000320"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:19.431058" 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-11T00:50:19.430671" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:19.431572" 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-11T00:50:19.431247" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:19.431735" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:50:19.431902" 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-11T00:50:19.430276" elapsed="0.001653"/>
</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-11T00:50:19.432085" elapsed="0.000160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:19.432792" level="INFO">${ds_type} = operational</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-11T00:50:19.432437" elapsed="0.000383"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:19.433222" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:19.432981" elapsed="0.000268"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:19.433693" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:19.433424" elapsed="0.000299"/>
</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-11T00:50:19.434126" 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-11T00:50:19.434409" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:19.434235" elapsed="0.000235"/>
</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-11T00:50:19.434637" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:19.434496" 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-11T00:50:19.434858" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:19.434716" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:19.434215" elapsed="0.000744"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:19.433958" elapsed="0.001026"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:19.433773" elapsed="0.001236"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:19.435050" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:50:19.435252" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:19.435298" 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-11T00:50:19.429541" elapsed="0.005781"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:19.435802" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:19.435879" 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-11T00:50:19.435523" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:19.436494" 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-11T00:50:19.436190" elapsed="0.000377">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:19.435972" elapsed="0.000664">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:19.435953" elapsed="0.000724">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-11T00:50:19.436829" elapsed="0.000023"/>
</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-11T00:50:19.437001" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:19.437068" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:19.426868" elapsed="0.010307">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:19.426624" elapsed="0.010622">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:19.426477" elapsed="0.010826">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:19.426050" elapsed="0.011364">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:19.437668" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:19.400604" elapsed="0.037221">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:20.463453" elapsed="0.000251"/>
</kw>
<msg time="2026-04-11T00:50:20.463777" 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-11T00:50:20.462795" elapsed="0.001048"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:20.462311" elapsed="0.001610"/>
</kw>
<msg time="2026-04-11T00:50:20.463967" 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-11T00:50:20.454256" elapsed="0.009755"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:20.453790" elapsed="0.010294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:20.464550" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:20.464276" elapsed="0.000318"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:20.469589" 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-11T00:50:20.469189" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:20.470057" 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-11T00:50:20.469774" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:20.470130" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:20.470286" 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-11T00:50:20.468802" elapsed="0.001508"/>
</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-11T00:50:20.470475" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:20.471120" level="INFO">${ds_type} = operational</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-11T00:50:20.470795" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:20.471552" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:20.471299" elapsed="0.000279"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:20.471951" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:20.471721" 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-11T00:50:20.472363" elapsed="0.000045"/>
</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-11T00:50:20.472641" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:20.472494" 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-11T00:50:20.472858" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:20.472720" elapsed="0.000191"/>
</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-11T00:50:20.473071" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:20.472934" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:20.472474" elapsed="0.000699"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:20.472199" elapsed="0.000997"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:20.472021" elapsed="0.001210"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:20.473271" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:20.473485" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:20.473531" 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-11T00:50:20.468084" elapsed="0.005470"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:20.475769" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:20.475851" 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-11T00:50:20.473795" elapsed="0.002080"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:20.476474" 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-11T00:50:20.476170" elapsed="0.000378">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:20.475948" elapsed="0.000667">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:20.475929" elapsed="0.000718">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-11T00:50:20.476800" 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-11T00:50:20.476972" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:20.477037" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:20.465621" elapsed="0.011533">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:20.465370" elapsed="0.011853">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:20.465218" elapsed="0.012059">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:20.464817" elapsed="0.012547">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:20.477611" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:20.439108" elapsed="0.038620">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:21.503065" elapsed="0.000238"/>
</kw>
<msg time="2026-04-11T00:50:21.503371" 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-11T00:50:21.502417" elapsed="0.001036"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:21.501938" elapsed="0.001595"/>
</kw>
<msg time="2026-04-11T00:50:21.503580" 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-11T00:50:21.493776" elapsed="0.009848"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:21.493353" elapsed="0.010344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:21.504146" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:21.503890" elapsed="0.000300"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:21.509531" 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-11T00:50:21.509125" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:21.510004" 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-11T00:50:21.509717" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:21.510077" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:21.510236" 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-11T00:50:21.508698" elapsed="0.001562"/>
</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-11T00:50:21.510432" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:21.511072" level="INFO">${ds_type} = operational</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-11T00:50:21.510743" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:21.511599" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:21.511339" elapsed="0.000287"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:21.512014" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:21.511778" elapsed="0.000261"/>
</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-11T00:50:21.512447" 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-11T00:50:21.512752" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:21.512555" elapsed="0.000254"/>
</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-11T00:50:21.512973" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:21.512834" elapsed="0.000192"/>
</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-11T00:50:21.513188" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:21.513048" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:21.512536" elapsed="0.000725"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:21.512266" elapsed="0.001019"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:21.512086" elapsed="0.001223"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:21.513348" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:21.513563" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:21.513608" 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-11T00:50:21.507908" elapsed="0.005724"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:21.514070" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:21.514145" 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-11T00:50:21.513801" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:21.514745" 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-11T00:50:21.514466" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:21.514236" elapsed="0.000652">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:21.514219" 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-11T00:50:21.515068" 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-11T00:50:21.515238" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:21.515303" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:21.505219" elapsed="0.010204">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:21.504988" elapsed="0.010506">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:21.504848" elapsed="0.010702">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:21.504429" elapsed="0.011209">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:21.515867" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:21.478632" elapsed="0.037350">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:22.546860" elapsed="0.000385"/>
</kw>
<msg time="2026-04-11T00:50:22.547314" 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-11T00:50:22.546197" elapsed="0.001182"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:22.545733" elapsed="0.001862"/>
</kw>
<msg time="2026-04-11T00:50:22.547643" 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-11T00:50:22.537598" elapsed="0.010091"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:22.537154" elapsed="0.010610"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:22.548226" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:22.547955" elapsed="0.000317"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:22.553270" 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-11T00:50:22.552885" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:22.553757" 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-11T00:50:22.553471" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:22.553831" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:22.553988" 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-11T00:50:22.552508" elapsed="0.001504"/>
</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-11T00:50:22.554163" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:22.554911" level="INFO">${ds_type} = operational</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-11T00:50:22.554505" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:22.555417" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:22.555128" elapsed="0.000319"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:22.555848" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:22.555612" 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-11T00:50:22.556302" 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-11T00:50:22.556577" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:22.556427" 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-11T00:50:22.556795" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:22.556657" elapsed="0.000191"/>
</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-11T00:50:22.557010" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:22.556871" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:22.556407" elapsed="0.000676"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:22.556104" elapsed="0.001002"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:22.555920" elapsed="0.001212"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:22.557171" elapsed="0.000026"/>
</return>
<msg time="2026-04-11T00:50:22.557371" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:22.557433" 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-11T00:50:22.551750" elapsed="0.005707"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:22.557896" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:22.557972" 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-11T00:50:22.557628" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:22.558771" 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-11T00:50:22.558277" elapsed="0.000575">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:22.558063" elapsed="0.000903">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:22.558045" elapsed="0.000954">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-11T00:50:22.559154" 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-11T00:50:22.559326" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:22.559405" elapsed="0.000017"/>
</return>
<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>
<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-11T00:50:22.549280" elapsed="0.010237">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:22.549049" elapsed="0.010537">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:22.548908" elapsed="0.010732">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:22.548514" elapsed="0.011215">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:22.559957" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:22.516919" elapsed="0.043152">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:23.588218" elapsed="0.000268"/>
</kw>
<msg time="2026-04-11T00:50:23.588558" 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-11T00:50:23.587543" elapsed="0.001085"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:23.587040" elapsed="0.001670"/>
</kw>
<msg time="2026-04-11T00:50:23.588756" 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-11T00:50:23.577848" elapsed="0.010952"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:23.577177" elapsed="0.011695"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:23.589327" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:23.589071" elapsed="0.000301"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:23.594436" 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-11T00:50:23.594032" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:23.594911" 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-11T00:50:23.594623" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:23.594986" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:23.595143" 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-11T00:50:23.593664" elapsed="0.001503"/>
</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-11T00:50:23.595315" elapsed="0.000169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:23.595992" level="INFO">${ds_type} = operational</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-11T00:50:23.595641" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:23.596653" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:23.596175" elapsed="0.000505"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:23.597073" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:23.596828" elapsed="0.000271"/>
</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-11T00:50:23.597620" elapsed="0.000026"/>
</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-11T00:50:23.597882" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:23.597733" 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-11T00:50:23.598102" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:23.597962" elapsed="0.000194"/>
</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-11T00:50:23.598321" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:23.598180" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:23.597713" elapsed="0.000697"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:23.597327" elapsed="0.001108"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:23.597145" elapsed="0.001316"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:23.598501" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:23.598701" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:23.598746" 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-11T00:50:23.592933" elapsed="0.005836"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:23.599207" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:23.599283" 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-11T00:50:23.598938" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:23.599942" 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-11T00:50:23.599607" elapsed="0.000410">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:23.599375" elapsed="0.000710">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:23.599357" elapsed="0.000760">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-11T00:50:23.600267" 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-11T00:50:23.600455" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:23.600522" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:23.590412" elapsed="0.010216">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:23.590160" elapsed="0.010538">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:23.590015" elapsed="0.010739">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:23.589617" elapsed="0.011228">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:23.601076" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:23.561004" elapsed="0.040187">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:24.625812" elapsed="0.000238"/>
</kw>
<msg time="2026-04-11T00:50:24.626115" 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-11T00:50:24.625151" elapsed="0.001027"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:24.624690" elapsed="0.001572"/>
</kw>
<msg time="2026-04-11T00:50:24.626306" 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-11T00:50:24.616489" elapsed="0.009861"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:24.616065" elapsed="0.010472"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:24.626998" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:24.626731" elapsed="0.000313"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:24.632319" 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-11T00:50:24.631932" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:24.632817" 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-11T00:50:24.632525" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:24.632892" elapsed="0.000035"/>
</return>
<msg time="2026-04-11T00:50:24.633058" 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-11T00:50:24.631564" elapsed="0.001518"/>
</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-11T00:50:24.633236" elapsed="0.000172"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:24.633906" level="INFO">${ds_type} = operational</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-11T00:50:24.633567" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:24.634327" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:24.634087" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:24.634757" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:24.634518" elapsed="0.000265"/>
</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-11T00:50:24.635199" elapsed="0.000035"/>
</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-11T00:50:24.635484" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:24.635318" elapsed="0.000224"/>
</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-11T00:50:24.635705" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:24.635566" 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-11T00:50:24.635926" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:24.635782" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:24.635299" elapsed="0.000700"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:24.635010" elapsed="0.001012"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:24.634829" elapsed="0.001218"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:24.636086" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:50:24.636289" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:24.636336" 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-11T00:50:24.630818" elapsed="0.005541"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:24.636823" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:24.636901" 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-11T00:50:24.636548" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:24.637503" 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-11T00:50:24.637206" elapsed="0.000367">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:24.636992" elapsed="0.000646">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:24.636974" 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-11T00:50:24.637819" 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-11T00:50:24.637989" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:24.638092" elapsed="0.000017"/>
</return>
<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>
<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-11T00:50:24.628087" elapsed="0.010114">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:24.627846" elapsed="0.010425">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:24.627702" elapsed="0.010624">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:24.627288" elapsed="0.011144">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:24.638666" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:24.602070" elapsed="0.036711">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:25.663345" elapsed="0.000252"/>
</kw>
<msg time="2026-04-11T00:50:25.663665" 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-11T00:50:25.662699" elapsed="0.001030"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:25.662214" elapsed="0.001592"/>
</kw>
<msg time="2026-04-11T00:50:25.663851" 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-11T00:50:25.653786" elapsed="0.010109"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:25.653200" elapsed="0.010768"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:25.664430" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:25.664159" elapsed="0.000316"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:25.669477" 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-11T00:50:25.669071" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:25.669954" 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-11T00:50:25.669666" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:25.670027" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:25.670185" 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-11T00:50:25.668696" elapsed="0.001514"/>
</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-11T00:50:25.670360" elapsed="0.000170"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:25.671054" level="INFO">${ds_type} = operational</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-11T00:50:25.670699" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:25.671484" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:25.671235" elapsed="0.000275"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:25.671886" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:25.671654" elapsed="0.000258"/>
</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-11T00:50:25.672306" 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-11T00:50:25.672573" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:25.672426" elapsed="0.000265"/>
</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-11T00:50:25.672863" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:25.672719" elapsed="0.000198"/>
</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-11T00:50:25.673081" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:25.672941" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:25.672406" elapsed="0.000749"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:25.672142" elapsed="0.001037"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:25.671963" elapsed="0.001242"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:25.673244" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:25.673464" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:25.673510" 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-11T00:50:25.667962" elapsed="0.005571"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:25.673969" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:25.674045" 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-11T00:50:25.673702" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:25.674844" 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-11T00:50:25.674537" elapsed="0.000379">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:25.674137" elapsed="0.000849">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:25.674120" elapsed="0.000898">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-11T00:50:25.675172" 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-11T00:50:25.675342" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:25.675424" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:25.665469" elapsed="0.010063">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:25.665225" elapsed="0.010376">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:25.665086" elapsed="0.010570">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:25.664697" elapsed="0.011049">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:25.675976" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:25.639701" elapsed="0.036390">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:26.703000" elapsed="0.000239"/>
</kw>
<msg time="2026-04-11T00:50:26.703306" 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-11T00:50:26.702343" elapsed="0.001030"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:26.701861" elapsed="0.001609"/>
</kw>
<msg time="2026-04-11T00:50:26.703516" 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-11T00:50:26.693845" elapsed="0.009723"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:26.693441" elapsed="0.010202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:26.704105" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:26.703847" elapsed="0.000304"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:26.709379" 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-11T00:50:26.708996" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:26.709871" 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-11T00:50:26.709586" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:26.709944" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:26.710100" 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-11T00:50:26.708629" elapsed="0.001495"/>
</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-11T00:50:26.710441" elapsed="0.000171"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:26.711102" level="INFO">${ds_type} = operational</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-11T00:50:26.710770" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:26.711540" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:26.711284" elapsed="0.000282"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:26.711946" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:26.711711" elapsed="0.000261"/>
</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-11T00:50:26.712365" elapsed="0.000038"/>
</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-11T00:50:26.712635" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:26.712488" 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-11T00:50:26.712853" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:26.712714" 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-11T00:50:26.713070" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:26.712930" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:26.712469" elapsed="0.000675"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:26.712195" elapsed="0.000972"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:26.712017" elapsed="0.001175"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:26.713231" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:26.713444" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:26.713492" 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-11T00:50:26.707903" elapsed="0.005612"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:26.713951" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:26.714026" 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-11T00:50:26.713685" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:26.715418" 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-11T00:50:26.715124" elapsed="0.000366">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:26.714117" elapsed="0.001438">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:26.714099" elapsed="0.001488">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-11T00:50:26.715738" 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-11T00:50:26.715908" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:26.715974" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:26.705244" elapsed="0.010836">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:26.705012" elapsed="0.011180">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:26.704873" elapsed="0.011376">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:26.704473" elapsed="0.011865">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:26.716586" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:26.677046" elapsed="0.039657">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:27.740626" elapsed="0.000249"/>
</kw>
<msg time="2026-04-11T00:50:27.740950" 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-11T00:50:27.739965" elapsed="0.001073"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:27.739507" elapsed="0.001640"/>
</kw>
<msg time="2026-04-11T00:50:27.741197" 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-11T00:50:27.731488" elapsed="0.009755"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:27.731055" elapsed="0.010261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:27.741804" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:27.741532" elapsed="0.000317"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:27.746863" 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-11T00:50:27.746475" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:27.747333" 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-11T00:50:27.747050" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:27.747424" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:50:27.747586" 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-11T00:50:27.746084" 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-11T00:50:27.747759" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:27.748412" level="INFO">${ds_type} = operational</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-11T00:50:27.748068" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:27.748830" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:27.748595" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:27.749230" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:27.748998" elapsed="0.000256"/>
</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-11T00:50:27.749708" elapsed="0.000045"/>
</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-11T00:50:27.750003" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:27.749844" elapsed="0.000216"/>
</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-11T00:50:27.750224" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:27.750086" elapsed="0.000191"/>
</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-11T00:50:27.750459" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:27.750300" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:27.749820" elapsed="0.000786"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:27.749540" elapsed="0.001090"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:27.749304" elapsed="0.001353"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:27.750698" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:27.750898" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:27.750942" 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-11T00:50:27.745350" elapsed="0.005615"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:27.751591" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:27.751670" 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-11T00:50:27.751136" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:27.752268" 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-11T00:50:27.751980" elapsed="0.000366">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:27.751763" elapsed="0.000669">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:27.751745" elapsed="0.000721">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-11T00:50:27.752618" 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-11T00:50:27.752789" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:27.752853" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:27.742883" elapsed="0.010078">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:27.742643" elapsed="0.010386">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:27.742493" elapsed="0.010590">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:27.742080" elapsed="0.011090">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:27.753413" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:27.717607" elapsed="0.035924">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:28.778012" elapsed="0.000244"/>
</kw>
<msg time="2026-04-11T00:50:28.778324" 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-11T00:50:28.777348" elapsed="0.001060"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:28.776845" elapsed="0.001654"/>
</kw>
<msg time="2026-04-11T00:50:28.778546" 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-11T00:50:28.768269" elapsed="0.010320"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:28.767700" elapsed="0.010960"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:28.779109" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:28.778851" elapsed="0.000303"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:28.784291" 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-11T00:50:28.783911" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:28.784861" 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-11T00:50:28.784566" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:28.784935" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:28.785092" 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-11T00:50:28.783545" elapsed="0.001571"/>
</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-11T00:50:28.785294" elapsed="0.000176"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:28.785957" level="INFO">${ds_type} = operational</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-11T00:50:28.785628" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:28.786371" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:28.786138" elapsed="0.000276"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:28.786792" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:28.786559" elapsed="0.000258"/>
</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-11T00:50:28.787202" 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-11T00:50:28.787476" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:28.787308" elapsed="0.000224"/>
</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-11T00:50:28.787696" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:28.787557" elapsed="0.000191"/>
</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-11T00:50:28.787909" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:28.787771" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:28.787289" elapsed="0.000691"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:28.787039" elapsed="0.000965"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:28.786862" elapsed="0.001168"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:28.788068" elapsed="0.000026"/>
</return>
<msg time="2026-04-11T00:50:28.788263" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:28.788309" 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-11T00:50:28.782825" elapsed="0.005506"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:28.788782" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:28.788858" 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-11T00:50:28.788516" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:28.789479" 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-11T00:50:28.789161" elapsed="0.000394">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:28.788949" elapsed="0.000677">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:28.788932" elapsed="0.000724">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-11T00:50:28.789805" 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-11T00:50:28.789981" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:28.790046" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:28.780172" elapsed="0.009978">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:28.779930" elapsed="0.010289">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:28.779790" elapsed="0.010483">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:28.779395" elapsed="0.010965">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:28.790605" elapsed="0.000062"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:28.754442" elapsed="0.036319">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:29.816946" elapsed="0.000283"/>
</kw>
<msg time="2026-04-11T00:50:29.817301" 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-11T00:50:29.816244" elapsed="0.001122"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:29.815757" elapsed="0.001714"/>
</kw>
<msg time="2026-04-11T00:50:29.817518" 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-11T00:50:29.807580" elapsed="0.009982"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:29.807148" elapsed="0.010490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:29.818116" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:29.817841" elapsed="0.000331"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:29.823189" 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-11T00:50:29.822801" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:29.823677" 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-11T00:50:29.823374" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:29.823752" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:50:29.823914" 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-11T00:50:29.822432" elapsed="0.001506"/>
</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-11T00:50:29.824089" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:29.824799" level="INFO">${ds_type} = operational</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-11T00:50:29.824429" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:29.825230" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:29.824986" elapsed="0.000269"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:29.825653" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:29.825417" elapsed="0.000261"/>
</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-11T00:50:29.826091" 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-11T00:50:29.826350" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:29.826200" elapsed="0.000223"/>
</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-11T00:50:29.826591" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:29.826450" 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-11T00:50:29.826826" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:29.826677" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:29.826181" elapsed="0.000721"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:29.825904" elapsed="0.001021"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:29.825725" elapsed="0.001226"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:29.826990" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:29.827188" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:29.827233" 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-11T00:50:29.821713" elapsed="0.005544"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:29.827781" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:29.827857" 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-11T00:50:29.827508" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:29.828709" 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-11T00:50:29.828199" elapsed="0.000599">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:29.827955" elapsed="0.000913">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:29.827932" elapsed="0.000968">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-11T00:50:29.829052" 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-11T00:50:29.829239" elapsed="0.000028"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:29.829328" elapsed="0.000018"/>
</return>
<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>
<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-11T00:50:29.819193" elapsed="0.010266">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:29.818959" elapsed="0.010575">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:29.818814" elapsed="0.010772">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:29.818416" elapsed="0.011258">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:29.829904" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:29.791722" elapsed="0.038296">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:30.854834" elapsed="0.000243"/>
</kw>
<msg time="2026-04-11T00:50:30.855145" 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-11T00:50:30.854171" elapsed="0.001040"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:30.853713" elapsed="0.001579"/>
</kw>
<msg time="2026-04-11T00:50:30.855337" 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-11T00:50:30.845594" elapsed="0.009800"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:30.845164" elapsed="0.010308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:30.855925" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:30.855665" elapsed="0.000306"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:30.860995" 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-11T00:50:30.860608" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:30.861491" 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-11T00:50:30.861185" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:30.861564" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:30.861723" 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-11T00:50:30.860208" 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-11T00:50:30.861969" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:30.862639" level="INFO">${ds_type} = operational</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-11T00:50:30.862283" elapsed="0.000383"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:30.863255" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:30.862822" elapsed="0.000460"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:30.863695" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:30.863447" 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-11T00:50:30.864121" 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-11T00:50:30.864413" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:30.864229" elapsed="0.000242"/>
</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-11T00:50:30.864637" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:30.864496" elapsed="0.000194"/>
</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-11T00:50:30.864853" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:30.864713" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:30.864210" elapsed="0.000716"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:30.863954" elapsed="0.000995"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:30.863770" elapsed="0.001204"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:30.865013" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:30.865217" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:30.865263" 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-11T00:50:30.859495" elapsed="0.005792"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:30.865741" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:30.865819" 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-11T00:50:30.865471" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:30.866436" 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-11T00:50:30.866129" elapsed="0.000379">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:30.865912" elapsed="0.000662">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:30.865893" elapsed="0.000713">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-11T00:50:30.866758" 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-11T00:50:30.866932" elapsed="0.000033"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:30.867010" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:30.856997" elapsed="0.010122">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:30.856763" elapsed="0.010428">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:30.856621" elapsed="0.010626">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:30.856194" elapsed="0.011145">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:30.867596" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:30.830901" elapsed="0.036812">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:31.893459" elapsed="0.000244"/>
</kw>
<msg time="2026-04-11T00:50:31.893770" 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-11T00:50:31.892590" elapsed="0.001246"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:31.892065" elapsed="0.001851"/>
</kw>
<msg time="2026-04-11T00:50:31.893962" 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-11T00:50:31.883320" elapsed="0.010686"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:31.882576" elapsed="0.011504"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:31.894583" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:31.894297" elapsed="0.000333"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:31.900008" 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-11T00:50:31.899591" elapsed="0.000445"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:31.900503" 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-11T00:50:31.900198" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:31.900579" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:31.900737" 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-11T00:50:31.899200" elapsed="0.001562"/>
</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-11T00:50:31.900912" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:31.901571" level="INFO">${ds_type} = operational</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-11T00:50:31.901223" elapsed="0.000375"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:31.901990" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:31.901754" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:31.902412" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:31.902159" elapsed="0.000279"/>
</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-11T00:50:31.902835" 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-11T00:50:31.903088" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:31.902942" 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-11T00:50:31.903319" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:31.903167" elapsed="0.000207"/>
</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-11T00:50:31.903555" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:31.903413" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:31.902922" elapsed="0.000705"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:31.902671" elapsed="0.000979"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:31.902487" elapsed="0.001188"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:31.903713" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:31.903937" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:31.903983" 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-11T00:50:31.898486" elapsed="0.005521"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:31.904460" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:31.904538" 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-11T00:50:31.904176" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:31.905175" 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-11T00:50:31.904895" elapsed="0.000352">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:31.904678" elapsed="0.000635">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:31.904659" elapsed="0.000685">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-11T00:50:31.905512" 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-11T00:50:31.905839" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:31.905904" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:31.895672" elapsed="0.010338">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:31.895432" elapsed="0.010647">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:31.895263" elapsed="0.010871">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:31.894860" elapsed="0.011367">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:31.906475" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:31.868646" elapsed="0.037944">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:32.932776" elapsed="0.000309"/>
</kw>
<msg time="2026-04-11T00:50:32.933156" 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-11T00:50:32.932054" elapsed="0.001168"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:32.931583" elapsed="0.001724"/>
</kw>
<msg time="2026-04-11T00:50:32.933355" 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-11T00:50:32.922665" elapsed="0.010752"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:32.922034" elapsed="0.011463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:32.934012" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:32.933741" elapsed="0.000318"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:32.939287" 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-11T00:50:32.938849" elapsed="0.000481"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:32.939830" 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-11T00:50:32.939511" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:32.939906" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:32.940124" 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-11T00:50:32.938475" elapsed="0.001688"/>
</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-11T00:50:32.940327" elapsed="0.000191"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:32.941021" level="INFO">${ds_type} = operational</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-11T00:50:32.940680" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:32.941483" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:32.941203" elapsed="0.000380"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:32.941980" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:32.941737" elapsed="0.000270"/>
</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-11T00:50:32.942424" 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-11T00:50:32.942689" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:32.942540" 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-11T00:50:32.942909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:32.942769" 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-11T00:50:32.943135" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:32.942993" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:32.942522" elapsed="0.000688"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:32.942241" elapsed="0.000993"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:32.942054" elapsed="0.001205"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:32.943310" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:50:32.943543" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:32.943591" 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-11T00:50:32.937730" elapsed="0.005884"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:32.944064" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:32.944140" 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-11T00:50:32.943785" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:32.944993" 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-11T00:50:32.944509" elapsed="0.000558">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:32.944244" elapsed="0.000895">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:32.944220" elapsed="0.000952">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-11T00:50:32.945336" elapsed="0.000026"/>
</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-11T00:50:32.945538" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:32.945605" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:32.935111" elapsed="0.010604">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:32.934874" elapsed="0.010913">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:32.934729" elapsed="0.011114">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:32.934289" elapsed="0.011643">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:32.946164" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:32.907502" elapsed="0.038779">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:33.970420" elapsed="0.000254"/>
</kw>
<msg time="2026-04-11T00:50:33.970745" 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-11T00:50:33.969725" elapsed="0.001102"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:33.969246" elapsed="0.001665"/>
</kw>
<msg time="2026-04-11T00:50:33.971059" 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-11T00:50:33.960983" elapsed="0.010124"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:33.960564" elapsed="0.010619"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:33.971675" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:33.971410" elapsed="0.000312"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:33.976969" 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-11T00:50:33.976506" elapsed="0.000499"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:33.977575" 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-11T00:50:33.977214" elapsed="0.000389"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:33.977652" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:50:33.977868" 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-11T00:50:33.976070" elapsed="0.001833"/>
</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-11T00:50:33.978077" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:33.979062" level="INFO">${ds_type} = operational</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-11T00:50:33.978442" elapsed="0.000649"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:33.979519" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:33.979254" elapsed="0.000292"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:33.979937" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:33.979695" elapsed="0.000268"/>
</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-11T00:50:33.980363" elapsed="0.000040"/>
</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-11T00:50:33.980660" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:33.980490" elapsed="0.000231"/>
</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-11T00:50:33.980891" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:33.980748" elapsed="0.000197"/>
</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-11T00:50:33.981110" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:33.980968" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:33.980470" elapsed="0.000714"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:33.980195" elapsed="0.001012"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:33.980011" elapsed="0.001222"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:33.981272" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:50:33.981497" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:33.981544" 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-11T00:50:33.975336" elapsed="0.006231"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:33.982042" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:33.982119" 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-11T00:50:33.981765" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:33.982748" 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-11T00:50:33.982450" elapsed="0.000387">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:33.982214" elapsed="0.000701">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:33.982195" elapsed="0.000791">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-11T00:50:33.983147" elapsed="0.000023"/>
</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-11T00:50:33.983324" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:33.983407" elapsed="0.000017"/>
</return>
<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>
<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-11T00:50:33.972771" elapsed="0.010747">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:33.972516" elapsed="0.011074">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:33.972356" elapsed="0.011290">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:33.971956" elapsed="0.011782">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:33.983972" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:33.947208" elapsed="0.036880">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:35.009135" elapsed="0.000265"/>
</kw>
<msg time="2026-04-11T00:50:35.009476" 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-11T00:50:35.008477" elapsed="0.001068"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:35.008000" elapsed="0.001624"/>
</kw>
<msg time="2026-04-11T00:50:35.009670" 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-11T00:50:34.999897" elapsed="0.009817"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:34.999471" elapsed="0.010317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:35.010255" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:35.009990" elapsed="0.000312"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:35.015638" 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-11T00:50:35.015228" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:35.016112" 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-11T00:50:35.015825" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:35.016186" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:35.016344" 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-11T00:50:35.014850" elapsed="0.001518"/>
</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-11T00:50:35.016537" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:35.017184" level="INFO">${ds_type} = operational</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-11T00:50:35.016849" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:35.017619" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:35.017366" elapsed="0.000279"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:35.018027" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:35.017792" 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-11T00:50:35.018491" 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-11T00:50:35.018818" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:35.018668" elapsed="0.000206"/>
</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-11T00:50:35.019041" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:35.018900" 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-11T00:50:35.019260" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:35.019119" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:35.018648" elapsed="0.000687"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:35.018284" elapsed="0.001075"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:35.018097" elapsed="0.001311"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:35.019450" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:35.019652" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:35.019698" 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-11T00:50:35.014101" elapsed="0.005620"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:35.020169" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:35.020246" 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-11T00:50:35.019891" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:35.020852" 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-11T00:50:35.020570" elapsed="0.000356">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:35.020338" elapsed="0.000655">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:35.020320" elapsed="0.000705">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-11T00:50:35.021174" 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-11T00:50:35.021344" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:35.021425" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:35.011331" elapsed="0.010201">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:35.011096" elapsed="0.010506">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:35.010953" elapsed="0.010703">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:35.010559" elapsed="0.011184">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:35.021974" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:34.984975" elapsed="0.037113">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:36.046988" elapsed="0.000241"/>
</kw>
<msg time="2026-04-11T00:50:36.047299" 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-11T00:50:36.046313" elapsed="0.001054"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:36.045760" elapsed="0.001709"/>
</kw>
<msg time="2026-04-11T00:50:36.047517" 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-11T00:50:36.037214" elapsed="0.010347"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:36.036646" elapsed="0.010987"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:36.048199" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:36.047933" elapsed="0.000312"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:36.053306" 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-11T00:50:36.052921" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:36.053797" 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-11T00:50:36.053510" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:36.053884" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:36.054042" 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-11T00:50:36.052542" 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-11T00:50:36.054221" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:36.054887" level="INFO">${ds_type} = operational</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-11T00:50:36.054553" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:36.055302" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:36.055067" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:36.055724" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:36.055488" 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-11T00:50:36.056143" 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-11T00:50:36.056410" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:36.056249" 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-11T00:50:36.056631" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:36.056492" 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-11T00:50:36.056860" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:36.056715" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:36.056230" elapsed="0.000705"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:36.055978" elapsed="0.000980"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:36.055796" elapsed="0.001187"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:36.057022" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:36.057221" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:36.057268" 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-11T00:50:36.051801" elapsed="0.005491"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:36.057749" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:36.057827" 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-11T00:50:36.057481" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:36.058640" 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-11T00:50:36.058339" elapsed="0.000372">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:36.058117" elapsed="0.000660">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:36.057928" elapsed="0.000882">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-11T00:50:36.058960" 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-11T00:50:36.059127" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:36.059190" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:36.049260" elapsed="0.010076">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:36.049027" elapsed="0.010396">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:36.048882" elapsed="0.010596">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:36.048486" elapsed="0.011080">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:36.059796" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:36.023033" elapsed="0.036875">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:37.084197" elapsed="0.000252"/>
</kw>
<msg time="2026-04-11T00:50:37.084517" 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-11T00:50:37.083544" elapsed="0.001037"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:37.083077" elapsed="0.001582"/>
</kw>
<msg time="2026-04-11T00:50:37.084704" 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-11T00:50:37.075040" elapsed="0.009707"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:37.074626" elapsed="0.010193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:37.085265" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:37.085011" elapsed="0.000299"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:37.090471" 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-11T00:50:37.090074" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:37.090937" 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-11T00:50:37.090655" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:37.091009" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:37.091165" 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-11T00:50:37.089710" elapsed="0.001479"/>
</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-11T00:50:37.091339" elapsed="0.000173"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:37.091997" level="INFO">${ds_type} = operational</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-11T00:50:37.091669" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:37.092428" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:37.092178" elapsed="0.000277"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:37.092842" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:37.092606" 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-11T00:50:37.093256" 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-11T00:50:37.093556" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:37.093404" elapsed="0.000206"/>
</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-11T00:50:37.093773" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:37.093636" elapsed="0.000254"/>
</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-11T00:50:37.094056" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:37.093914" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:37.093345" elapsed="0.000784"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:37.093092" elapsed="0.001062"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:37.092913" elapsed="0.001268"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:37.094219" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:37.094432" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:37.094479" 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-11T00:50:37.088983" elapsed="0.005519"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:37.094950" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:37.095026" 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-11T00:50:37.094670" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:37.095632" 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-11T00:50:37.095332" elapsed="0.000373">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:37.095118" elapsed="0.000655">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:37.095100" elapsed="0.000704">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-11T00:50:37.095953" 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-11T00:50:37.096124" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:37.096189" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:37.086342" elapsed="0.009952">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:37.086108" elapsed="0.010255">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:37.085958" elapsed="0.010476">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:37.085566" elapsed="0.010957">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:37.096754" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:37.060813" elapsed="0.036053">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:38.121496" elapsed="0.000230"/>
</kw>
<msg time="2026-04-11T00:50:38.121788" 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-11T00:50:38.120828" elapsed="0.001022"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:38.120351" elapsed="0.001577"/>
</kw>
<msg time="2026-04-11T00:50:38.121975" 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-11T00:50:38.111874" elapsed="0.010145"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:38.111297" elapsed="0.010796"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:38.122560" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:38.122286" elapsed="0.000319"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:38.127645" 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-11T00:50:38.127236" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:38.128114" 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-11T00:50:38.127829" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:38.128187" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:38.128342" 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-11T00:50:38.126869" elapsed="0.001497"/>
</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-11T00:50:38.128532" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:38.129197" level="INFO">${ds_type} = operational</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-11T00:50:38.128849" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:38.129633" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:38.129378" elapsed="0.000280"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:38.130037" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:38.129803" elapsed="0.000259"/>
</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-11T00:50:38.130468" 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-11T00:50:38.130719" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:38.130575" elapsed="0.000206"/>
</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-11T00:50:38.130944" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:38.130806" elapsed="0.000192"/>
</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-11T00:50:38.131164" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:38.131021" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:38.130557" elapsed="0.000682"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:38.130289" elapsed="0.000973"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:38.130108" elapsed="0.001179"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:38.131325" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:38.131539" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:38.131586" 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-11T00:50:38.126145" elapsed="0.005464"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:38.133630" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:38.133711" 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-11T00:50:38.131778" elapsed="0.001957"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:38.134309" 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-11T00:50:38.134024" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:38.133806" elapsed="0.000657">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:38.133788" elapsed="0.000708">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-11T00:50:38.134653" 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-11T00:50:38.134826" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:38.134893" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:38.123594" elapsed="0.011406">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:38.123352" elapsed="0.011717">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:38.123213" elapsed="0.011911">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:38.122825" elapsed="0.012426">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:38.135518" elapsed="0.000030"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:38.097756" elapsed="0.037893">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:39.160820" elapsed="0.000234"/>
</kw>
<msg time="2026-04-11T00:50:39.161120" 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-11T00:50:39.160149" elapsed="0.001036"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:39.159691" elapsed="0.001571"/>
</kw>
<msg time="2026-04-11T00:50:39.161307" 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-11T00:50:39.150934" elapsed="0.010417"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:39.150362" elapsed="0.011078"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:39.161886" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:39.161632" elapsed="0.000300"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:39.204116" 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-11T00:50:39.203667" elapsed="0.000481"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:39.204643" 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-11T00:50:39.204317" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:39.204718" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:50:39.204886" 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-11T00:50:39.203259" elapsed="0.001652"/>
</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-11T00:50:39.205064" elapsed="0.000165"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:39.205738" level="INFO">${ds_type} = operational</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-11T00:50:39.205401" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:39.206159" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:39.205918" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:39.206591" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:39.206332" elapsed="0.000285"/>
</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-11T00:50:39.207025" 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-11T00:50:39.207276" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:39.207129" 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-11T00:50:39.207509" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:39.207354" elapsed="0.000210"/>
</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-11T00:50:39.207726" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:39.207587" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:39.207110" elapsed="0.000689"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:39.206858" elapsed="0.000965"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:39.206667" elapsed="0.001258"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:39.207969" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:39.208170" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:39.208216" 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-11T00:50:39.202486" elapsed="0.005754"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:39.208717" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:39.208795" 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-11T00:50:39.208442" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:39.209414" 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-11T00:50:39.209108" elapsed="0.000376">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:39.208889" elapsed="0.000660">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:39.208871" elapsed="0.000711">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-11T00:50:39.209735" 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-11T00:50:39.209909" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:39.209980" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:39.162939" elapsed="0.047146">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:39.162707" elapsed="0.047448">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:39.162566" elapsed="0.047644">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:39.162155" elapsed="0.048145">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:39.210549" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:39.136576" elapsed="0.074090">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:40.237280" elapsed="0.000254"/>
</kw>
<msg time="2026-04-11T00:50:40.237611" 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-11T00:50:40.236622" elapsed="0.001052"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:40.236143" elapsed="0.001609"/>
</kw>
<msg time="2026-04-11T00:50:40.237797" 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-11T00:50:40.227999" elapsed="0.009842"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:40.227498" elapsed="0.010418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:40.238364" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:40.238106" elapsed="0.000318"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:40.243425" 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-11T00:50:40.243024" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:40.243923" 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-11T00:50:40.243620" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:40.244099" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:50:40.244266" 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-11T00:50:40.242653" elapsed="0.001638"/>
</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-11T00:50:40.244459" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:40.245115" level="INFO">${ds_type} = operational</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-11T00:50:40.244779" elapsed="0.000373"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:40.245570" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:40.245310" elapsed="0.000286"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:40.245992" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:40.245749" elapsed="0.000268"/>
</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-11T00:50:40.246436" 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-11T00:50:40.246694" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:40.246545" 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-11T00:50:40.246923" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:40.246780" elapsed="0.000197"/>
</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-11T00:50:40.247145" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:40.247001" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:40.246527" elapsed="0.000693"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:40.246253" elapsed="0.000990"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:40.246065" elapsed="0.001204"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:40.247310" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:40.247526" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:40.247573" 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-11T00:50:40.241924" elapsed="0.005673"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:40.248258" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:40.248337" 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-11T00:50:40.247767" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:40.248964" 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-11T00:50:40.248674" elapsed="0.000368">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:40.248449" elapsed="0.000660">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:40.248431" elapsed="0.000711">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-11T00:50:40.249296" 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-11T00:50:40.249485" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:40.249554" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:40.239437" elapsed="0.010223">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:40.239194" elapsed="0.010536">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:40.239047" elapsed="0.010747">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:40.238655" elapsed="0.011229">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:40.250115" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:40.211567" elapsed="0.038708">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:41.269204" elapsed="0.000247"/>
</kw>
<msg time="2026-04-11T00:50:41.269515" 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-11T00:50:41.268558" elapsed="0.001020"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:41.268077" elapsed="0.001603"/>
</kw>
<msg time="2026-04-11T00:50:41.269727" 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-11T00:50:41.259982" elapsed="0.009790"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:41.259565" elapsed="0.010283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:41.270293" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:41.270036" elapsed="0.000303"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:41.275531" 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-11T00:50:41.275116" elapsed="0.000443"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:41.276008" 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-11T00:50:41.275719" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:41.276082" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:41.276240" 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-11T00:50:41.274748" elapsed="0.001517"/>
</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-11T00:50:41.276433" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:41.277083" level="INFO">${ds_type} = operational</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-11T00:50:41.276748" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:41.277530" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:41.277268" elapsed="0.000288"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:41.277948" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:41.277703" elapsed="0.000271"/>
</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-11T00:50:41.278367" elapsed="0.000038"/>
</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-11T00:50:41.278640" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:41.278491" 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-11T00:50:41.278859" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:41.278719" 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-11T00:50:41.279074" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:41.278936" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:41.278472" elapsed="0.000675"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:41.278202" elapsed="0.000968"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:41.278020" elapsed="0.001176"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:41.279235" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:41.279474" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:41.279521" 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-11T00:50:41.274026" elapsed="0.005519"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:41.280053" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:41.280132" 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-11T00:50:41.279782" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:41.280739" 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-11T00:50:41.280458" elapsed="0.000350">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:41.280226" elapsed="0.000648">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:41.280208" elapsed="0.000698">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-11T00:50:41.281059" 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-11T00:50:41.281232" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:41.281298" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:41.271353" elapsed="0.010065">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:41.271119" elapsed="0.010372">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:41.270977" elapsed="0.010568">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:41.270582" elapsed="0.011054">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:41.281864" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:41.250841" elapsed="0.031137">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:42.308364" elapsed="0.000248"/>
</kw>
<msg time="2026-04-11T00:50:42.308675" 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-11T00:50:42.307715" elapsed="0.001022"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:42.307237" elapsed="0.001577"/>
</kw>
<msg time="2026-04-11T00:50:42.308861" 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-11T00:50:42.299153" elapsed="0.009752"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:42.298722" elapsed="0.010257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:42.309441" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:42.309169" elapsed="0.000317"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:42.314499" 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-11T00:50:42.314097" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:42.314986" 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-11T00:50:42.314686" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:42.315066" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:42.315223" 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-11T00:50:42.313726" elapsed="0.001521"/>
</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-11T00:50:42.315413" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:42.316059" level="INFO">${ds_type} = operational</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-11T00:50:42.315727" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:42.316570" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:42.316311" elapsed="0.000284"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:42.316987" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:42.316748" elapsed="0.000265"/>
</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-11T00:50:42.317420" 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-11T00:50:42.317682" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:42.317536" 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-11T00:50:42.317905" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:42.317764" elapsed="0.000197"/>
</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-11T00:50:42.318125" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:42.317984" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:42.317510" elapsed="0.000690"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:42.317240" elapsed="0.000984"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:42.317059" elapsed="0.001190"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:42.318288" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:42.318534" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:42.318580" 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-11T00:50:42.312987" elapsed="0.005617"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:42.319270" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:42.319349" 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-11T00:50:42.318776" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:42.319958" 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-11T00:50:42.319680" elapsed="0.000347">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:42.319461" elapsed="0.000631">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:42.319442" elapsed="0.000682">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-11T00:50:42.320274" 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-11T00:50:42.320462" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:42.320530" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:42.310478" elapsed="0.010158">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:42.310236" elapsed="0.010475">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:42.310099" elapsed="0.010667">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:42.309710" elapsed="0.011146">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:42.321087" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:42.282835" elapsed="0.038369">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:43.347379" elapsed="0.000255"/>
</kw>
<msg time="2026-04-11T00:50:43.347701" 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-11T00:50:43.346558" elapsed="0.001207"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:43.346062" elapsed="0.001870"/>
</kw>
<msg time="2026-04-11T00:50:43.347978" 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-11T00:50:43.337999" elapsed="0.010024"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:43.337590" elapsed="0.010508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:43.348568" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:43.348292" elapsed="0.000323"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:43.353762" 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-11T00:50:43.353363" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:43.354238" 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-11T00:50:43.353952" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:43.354313" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:43.354495" 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-11T00:50:43.352995" elapsed="0.001525"/>
</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-11T00:50:43.354671" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:43.355314" level="INFO">${ds_type} = operational</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-11T00:50:43.354982" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:43.355756" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:43.355512" elapsed="0.000271"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:43.356164" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:43.355928" 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-11T00:50:43.356611" 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-11T00:50:43.356863" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:43.356716" 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-11T00:50:43.357084" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:43.356943" elapsed="0.000197"/>
</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-11T00:50:43.357304" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:43.357163" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:43.356698" elapsed="0.000679"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:43.356445" elapsed="0.000971"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:43.356237" elapsed="0.001205"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:43.357482" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:43.357679" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:43.357725" 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-11T00:50:43.352267" elapsed="0.005481"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:43.358185" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:43.358262" 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-11T00:50:43.357919" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:43.358887" 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-11T00:50:43.358606" elapsed="0.000351">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:43.358354" elapsed="0.000706">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:43.358336" elapsed="0.000757">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-11T00:50:43.359243" 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-11T00:50:43.359431" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:43.359498" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:43.349616" elapsed="0.009987">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:43.349370" elapsed="0.010302">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:43.349230" elapsed="0.010496">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:43.348838" elapsed="0.010975">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:43.360039" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:43.322082" elapsed="0.038070">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:44.388743" elapsed="0.000260"/>
</kw>
<msg time="2026-04-11T00:50:44.389085" 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-11T00:50:44.387974" elapsed="0.001182"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:44.387503" elapsed="0.001734"/>
</kw>
<msg time="2026-04-11T00:50:44.389284" 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-11T00:50:44.379006" elapsed="0.010327"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:44.378478" elapsed="0.010968"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:44.389913" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:44.389650" elapsed="0.000328"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:44.395422" 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-11T00:50:44.394999" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:44.395901" 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-11T00:50:44.395613" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:44.395977" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:50:44.396138" 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-11T00:50:44.394623" 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-11T00:50:44.396314" elapsed="0.000183"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:44.396993" level="INFO">${ds_type} = operational</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-11T00:50:44.396656" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:44.397433" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:44.397176" elapsed="0.000284"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:44.397845" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:44.397607" elapsed="0.000264"/>
</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-11T00:50:44.398608" elapsed="0.000026"/>
</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-11T00:50:44.398957" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:44.398726" elapsed="0.000447"/>
</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-11T00:50:44.399429" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:44.399211" elapsed="0.000295"/>
</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-11T00:50:44.399735" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:44.399539" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:44.398702" elapsed="0.001136"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:44.398304" elapsed="0.001566"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:44.398100" elapsed="0.001808"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:44.399963" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:50:44.400246" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:44.400308" 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-11T00:50:44.393862" elapsed="0.006478"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:44.401341" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:44.401478" 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-11T00:50:44.400600" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:44.402348" 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-11T00:50:44.401923" elapsed="0.000545">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:44.401612" elapsed="0.000951">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:44.401586" elapsed="0.001021">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-11T00:50:44.402843" elapsed="0.000037"/>
</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-11T00:50:44.403111" elapsed="0.000028"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:44.403201" elapsed="0.000021"/>
</return>
<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>
<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-11T00:50:44.391056" elapsed="0.012291">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:44.390813" elapsed="0.012653">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:44.390660" elapsed="0.012883">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:44.390206" elapsed="0.013460">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:44.403987" elapsed="0.000034"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:44.361079" elapsed="0.043070">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:45.428800" elapsed="0.000263"/>
</kw>
<msg time="2026-04-11T00:50:45.429131" 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-11T00:50:45.428115" elapsed="0.001083"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:45.427637" elapsed="0.001643"/>
</kw>
<msg time="2026-04-11T00:50:45.429327" 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-11T00:50:45.419459" elapsed="0.009914"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:45.419035" elapsed="0.010538"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:45.430079" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:45.429798" elapsed="0.000332"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:45.435512" 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-11T00:50:45.435105" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:45.436028" 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-11T00:50:45.435732" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:45.436106" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:45.436267" 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-11T00:50:45.434730" elapsed="0.001562"/>
</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-11T00:50:45.436461" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:45.437163" level="INFO">${ds_type} = operational</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-11T00:50:45.436784" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:45.437688" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:45.437351" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:45.438104" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:45.437866" elapsed="0.000264"/>
</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-11T00:50:45.438543" 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-11T00:50:45.438797" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:45.438650" 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-11T00:50:45.439019" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:45.438876" elapsed="0.000198"/>
</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-11T00:50:45.439235" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:45.439097" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:45.438631" elapsed="0.000676"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:45.438354" elapsed="0.000976"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:45.438176" elapsed="0.001179"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:45.439413" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:45.439612" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:45.439658" 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-11T00:50:45.433977" elapsed="0.005704"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:45.440122" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:45.440198" 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-11T00:50:45.439855" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:45.440799" 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-11T00:50:45.440520" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:45.440289" elapsed="0.000653">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:45.440272" elapsed="0.000701">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-11T00:50:45.441123" 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-11T00:50:45.441294" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:45.441410" elapsed="0.000018"/>
</return>
<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>
<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-11T00:50:45.431178" elapsed="0.010358">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:45.430922" elapsed="0.010684">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:45.430778" elapsed="0.010882">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:45.430359" elapsed="0.011389">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:45.441977" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:45.405126" elapsed="0.036965">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:46.468475" elapsed="0.000239"/>
</kw>
<msg time="2026-04-11T00:50:46.468783" 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-11T00:50:46.467813" elapsed="0.001034"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:46.467333" elapsed="0.001592"/>
</kw>
<msg time="2026-04-11T00:50:46.468983" 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-11T00:50:46.458284" elapsed="0.010743"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:46.457720" elapsed="0.011381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:46.469566" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:46.469293" elapsed="0.000318"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:46.474629" 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-11T00:50:46.474229" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:46.475101" 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-11T00:50:46.474816" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:46.475174" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:46.475333" 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-11T00:50:46.473856" elapsed="0.001501"/>
</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-11T00:50:46.475524" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:46.476163" level="INFO">${ds_type} = operational</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-11T00:50:46.475836" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:46.476594" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:46.476344" elapsed="0.000275"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:46.477002" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:46.476762" elapsed="0.000266"/>
</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-11T00:50:46.477429" 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-11T00:50:46.477680" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:46.477535" elapsed="0.000276"/>
</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-11T00:50:46.477990" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:46.477846" 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-11T00:50:46.478212" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:46.478070" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:46.477516" elapsed="0.000770"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:46.477252" elapsed="0.001058"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:46.477073" elapsed="0.001263"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:46.478375" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:50:46.478592" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:46.478636" 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-11T00:50:46.473125" elapsed="0.005549"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:46.479280" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:46.479359" 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-11T00:50:46.478844" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:46.479980" 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-11T00:50:46.479697" elapsed="0.000353">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:46.479479" elapsed="0.000638">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:46.479460" elapsed="0.000689">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-11T00:50:46.480301" 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-11T00:50:46.480489" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:46.480557" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:46.470619" elapsed="0.010045">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:46.470370" elapsed="0.010363">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:46.470227" elapsed="0.010559">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:46.469835" elapsed="0.011039">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:46.481114" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:46.442977" elapsed="0.038252">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:47.500070" elapsed="0.000250"/>
</kw>
<msg time="2026-04-11T00:50:47.500401" 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-11T00:50:47.499417" elapsed="0.001079"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:47.498941" elapsed="0.001641"/>
</kw>
<msg time="2026-04-11T00:50:47.500628" 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-11T00:50:47.490896" elapsed="0.009776"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:47.490484" elapsed="0.010262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:47.501200" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:47.500944" elapsed="0.000301"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:47.507891" 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-11T00:50:47.507498" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:47.508362" 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-11T00:50:47.508076" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:47.508452" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:50:47.508628" 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-11T00:50:47.507111" elapsed="0.001542"/>
</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-11T00:50:47.508803" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:47.509465" level="INFO">${ds_type} = operational</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-11T00:50:47.509115" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:47.509886" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:47.509647" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:47.510304" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:47.510061" elapsed="0.000269"/>
</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-11T00:50:47.510743" 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-11T00:50:47.510997" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:47.510851" 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-11T00:50:47.511219" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:47.511079" 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-11T00:50:47.511455" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:47.511298" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:47.510831" elapsed="0.000700"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:47.510578" elapsed="0.000977"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:47.510378" elapsed="0.001202"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:47.511620" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:47.511819" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:47.511866" 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-11T00:50:47.506376" elapsed="0.005513"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:47.512325" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:47.512415" 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-11T00:50:47.512057" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:47.513026" 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-11T00:50:47.512750" elapsed="0.000347">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:47.512533" elapsed="0.000629">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:47.512513" elapsed="0.000680">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-11T00:50:47.513341" 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-11T00:50:47.513526" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:47.513592" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:47.502358" elapsed="0.011337">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:47.502122" elapsed="0.011679">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:47.501977" elapsed="0.011880">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:47.501575" elapsed="0.012370">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:47.514175" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:47.481810" elapsed="0.032480">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:48.545361" elapsed="0.000395"/>
</kw>
<msg time="2026-04-11T00:50:48.545839" 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-11T00:50:48.544273" elapsed="0.001637"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:48.543440" elapsed="0.002554"/>
</kw>
<msg time="2026-04-11T00:50:48.546041" 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-11T00:50:48.531790" elapsed="0.014297"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:48.531100" elapsed="0.015064"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:48.546677" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:48.546375" elapsed="0.000368"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:48.554262" 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-11T00:50:48.553826" elapsed="0.000464"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:48.554770" 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-11T00:50:48.554475" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:48.554847" elapsed="0.000036"/>
</return>
<msg time="2026-04-11T00:50:48.555021" 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-11T00:50:48.553364" elapsed="0.001682"/>
</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-11T00:50:48.555255" elapsed="0.000252"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:48.556288" level="INFO">${ds_type} = operational</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-11T00:50:48.555733" elapsed="0.000597"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:48.556993" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:48.556594" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:48.557658" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:48.557260" elapsed="0.000439"/>
</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-11T00:50:48.558277" elapsed="0.000026"/>
</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-11T00:50:48.558569" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:48.558411" elapsed="0.000215"/>
</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-11T00:50:48.558831" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:48.558653" elapsed="0.000256"/>
</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-11T00:50:48.559109" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:48.558943" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:48.558373" elapsed="0.000915"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:48.558073" elapsed="0.001243"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:48.557776" elapsed="0.001568"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:48.559407" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:50:48.559673" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:48.559729" 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-11T00:50:48.551925" elapsed="0.007833"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:48.560484" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:48.560606" 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-11T00:50:48.560032" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:48.561907" 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-11T00:50:48.561096" elapsed="0.000960">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:48.560753" elapsed="0.001411">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:48.560725" elapsed="0.001489">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-11T00:50:48.562401" elapsed="0.000025"/>
</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-11T00:50:48.562583" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:48.562650" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:48.548352" elapsed="0.014409">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:48.547904" elapsed="0.014928">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:48.547680" elapsed="0.015206">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:48.547071" elapsed="0.015905">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:48.563213" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:48.515000" elapsed="0.048332">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:49.587761" elapsed="0.000246"/>
</kw>
<msg time="2026-04-11T00:50:49.588075" 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-11T00:50:49.587072" elapsed="0.001073"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:49.586597" elapsed="0.001627"/>
</kw>
<msg time="2026-04-11T00:50:49.588271" 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-11T00:50:49.578457" elapsed="0.009858"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:49.577966" elapsed="0.010438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:49.588867" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:49.588605" elapsed="0.000307"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:49.594012" 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-11T00:50:49.593626" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:49.594603" 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-11T00:50:49.594287" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:49.594678" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:49.594837" 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-11T00:50:49.593238" elapsed="0.001624"/>
</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-11T00:50:49.595014" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:49.595766" level="INFO">${ds_type} = operational</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-11T00:50:49.595330" elapsed="0.000464"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:49.596421" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:49.595955" elapsed="0.000494"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:49.596843" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:49.596601" elapsed="0.000268"/>
</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-11T00:50:49.597262" 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-11T00:50:49.597535" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:49.597370" elapsed="0.000220"/>
</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-11T00:50:49.597754" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:49.597614" 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-11T00:50:49.597970" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:49.597830" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:49.597351" elapsed="0.000692"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:49.597096" elapsed="0.000971"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:49.596916" elapsed="0.001175"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:49.598130" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:49.598329" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:49.598375" 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-11T00:50:49.592528" elapsed="0.005886"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:49.598854" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:49.598930" 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-11T00:50:49.598585" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:49.599565" 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-11T00:50:49.599236" elapsed="0.000402">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:49.599021" elapsed="0.000684">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:49.599004" elapsed="0.000732">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-11T00:50:49.599887" 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-11T00:50:49.600058" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:49.600122" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:49.589951" elapsed="0.010276">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:49.589705" elapsed="0.010591">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:49.589563" elapsed="0.010788">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:49.589144" elapsed="0.011313">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:49.600689" elapsed="0.000077"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:49.564368" elapsed="0.036498">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:50.626022" elapsed="0.000333"/>
</kw>
<msg time="2026-04-11T00:50:50.626475" 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-11T00:50:50.625226" elapsed="0.001342"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:50.624764" elapsed="0.001904"/>
</kw>
<msg time="2026-04-11T00:50:50.626717" 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-11T00:50:50.616682" elapsed="0.010082"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:50.616253" elapsed="0.010587"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:50.627396" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:50.627080" elapsed="0.000366"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:50.633000" 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-11T00:50:50.632595" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:50.633509" 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-11T00:50:50.633188" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:50.633588" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:50:50.633752" 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-11T00:50:50.632208" elapsed="0.001569"/>
</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-11T00:50:50.633933" elapsed="0.000165"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:50.634668" level="INFO">${ds_type} = operational</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-11T00:50:50.634289" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:50.635126" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:50.634857" elapsed="0.000295"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:50.635561" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:50.635301" elapsed="0.000286"/>
</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-11T00:50:50.635986" 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-11T00:50:50.636246" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:50.636097" 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-11T00:50:50.636483" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:50.636327" elapsed="0.000212"/>
</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-11T00:50:50.636703" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:50.636562" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:50.636076" elapsed="0.000703"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:50.635819" elapsed="0.000984"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:50.635636" elapsed="0.001194"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:50.636870" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:50.637075" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:50.637121" 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-11T00:50:50.631500" elapsed="0.005645"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:50.637682" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:50.637763" 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-11T00:50:50.637402" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:50.638405" 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-11T00:50:50.638080" elapsed="0.000399">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:50.637860" elapsed="0.000688">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:50.637841" elapsed="0.000739">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-11T00:50:50.638776" elapsed="0.000026"/>
</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-11T00:50:50.638959" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:50.639041" elapsed="0.000017"/>
</return>
<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>
<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-11T00:50:50.628676" elapsed="0.010475">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:50.628429" elapsed="0.010794">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:50.628100" elapsed="0.011178">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:50.627687" elapsed="0.011681">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:50.639618" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:50.601800" elapsed="0.037934">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:51.668650" elapsed="0.000240"/>
</kw>
<msg time="2026-04-11T00:50:51.668956" 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-11T00:50:51.667978" elapsed="0.001043"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:51.667509" elapsed="0.001594"/>
</kw>
<msg time="2026-04-11T00:50:51.669150" 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-11T00:50:51.659208" elapsed="0.009988"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:51.658783" elapsed="0.010490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:51.669763" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:51.669483" elapsed="0.000331"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:51.675054" 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-11T00:50:51.674646" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:51.675555" 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-11T00:50:51.675248" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:51.675631" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:51.675805" 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-11T00:50:51.674215" 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-11T00:50:51.676072" elapsed="0.000163"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:51.676765" level="INFO">${ds_type} = operational</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-11T00:50:51.676413" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:51.677194" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:51.676953" elapsed="0.000268"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:51.677627" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:51.677368" elapsed="0.000285"/>
</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-11T00:50:51.678082" 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-11T00:50:51.678339" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:51.678191" elapsed="0.000223"/>
</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-11T00:50:51.678597" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:51.678441" elapsed="0.000212"/>
</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-11T00:50:51.678818" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:51.678677" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:51.678173" elapsed="0.000718"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:51.677912" elapsed="0.001003"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:51.677701" elapsed="0.001239"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:51.678979" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:51.679184" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:51.679231" 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-11T00:50:51.673486" elapsed="0.005768"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:51.679711" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:51.679788" 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-11T00:50:51.679440" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:51.680583" 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-11T00:50:51.680277" elapsed="0.000380">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:51.679880" elapsed="0.000845">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:51.679862" elapsed="0.000895">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-11T00:50:51.680909" 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-11T00:50:51.681092" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:51.681160" elapsed="0.000028"/>
</return>
<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>
<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-11T00:50:51.670875" elapsed="0.010407">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:51.670640" elapsed="0.010710">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:51.670469" elapsed="0.010960">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:51.670051" elapsed="0.011471">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:51.681756" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:51.640662" elapsed="0.041210">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:52.709521" elapsed="0.000359"/>
</kw>
<msg time="2026-04-11T00:50:52.709950" 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-11T00:50:52.708747" elapsed="0.001362"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:52.708255" elapsed="0.001942"/>
</kw>
<msg time="2026-04-11T00:50:52.710268" 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-11T00:50:52.698566" elapsed="0.011767"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:52.697926" elapsed="0.012501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:52.710983" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:52.710657" elapsed="0.000373"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:52.716297" 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-11T00:50:52.715902" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:52.716788" 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-11T00:50:52.716499" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:52.716864" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:52.717023" 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-11T00:50:52.715533" elapsed="0.001514"/>
</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-11T00:50:52.717199" elapsed="0.000172"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:52.717890" level="INFO">${ds_type} = operational</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-11T00:50:52.717550" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:52.718330" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:52.718091" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:52.718760" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:52.718520" elapsed="0.000266"/>
</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-11T00:50:52.719182" 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-11T00:50:52.719466" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:52.719291" elapsed="0.000233"/>
</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-11T00:50:52.719690" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:52.719550" elapsed="0.000194"/>
</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-11T00:50:52.719908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:52.719767" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:52.719272" elapsed="0.000709"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:52.719016" elapsed="0.000988"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:52.718834" elapsed="0.001195"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:52.720068" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:52.720270" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:52.720315" 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-11T00:50:52.714809" elapsed="0.005529"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:52.720808" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:52.720884" 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-11T00:50:52.720537" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:52.721550" 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-11T00:50:52.721238" elapsed="0.000390">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:52.721020" elapsed="0.000679">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:52.721002" elapsed="0.000728">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-11T00:50:52.721884" 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-11T00:50:52.722095" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:52.722165" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:52.712065" elapsed="0.010207">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:52.711817" elapsed="0.010524">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:52.711672" elapsed="0.010741">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:52.711258" elapsed="0.011247">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:52.722749" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:52.682815" elapsed="0.040052">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:53.748514" elapsed="0.000245"/>
</kw>
<msg time="2026-04-11T00:50:53.748837" 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-11T00:50:53.747781" elapsed="0.001122"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:53.747241" elapsed="0.001744"/>
</kw>
<msg time="2026-04-11T00:50:53.749031" 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-11T00:50:53.738884" elapsed="0.010192"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:53.738468" elapsed="0.010683"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:53.749645" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:53.749342" elapsed="0.000349"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:53.754796" 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-11T00:50:53.754406" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:53.755273" 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-11T00:50:53.754985" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:53.755347" elapsed="0.000049"/>
</return>
<msg time="2026-04-11T00:50:53.755527" 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-11T00:50:53.754020" elapsed="0.001532"/>
</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-11T00:50:53.755705" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:53.756394" level="INFO">${ds_type} = operational</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-11T00:50:53.756018" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:53.756855" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:53.756582" elapsed="0.000380"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:53.757366" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:53.757120" elapsed="0.000291"/>
</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-11T00:50:53.757844" 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-11T00:50:53.758103" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:53.757954" elapsed="0.000207"/>
</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-11T00:50:53.758336" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:53.758195" elapsed="0.000213"/>
</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-11T00:50:53.758576" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:53.758433" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:53.757934" elapsed="0.000717"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:53.757675" elapsed="0.001000"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:53.757460" elapsed="0.001242"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:53.758742" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:53.758942" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:53.758988" 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-11T00:50:53.753270" elapsed="0.005741"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:53.759479" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:53.759557" 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-11T00:50:53.759185" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:53.760349" 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-11T00:50:53.760041" elapsed="0.000411">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:53.759815" elapsed="0.000714">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:53.759631" elapsed="0.000932">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-11T00:50:53.760716" elapsed="0.000023"/>
</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-11T00:50:53.760890" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:53.760957" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:53.750760" elapsed="0.010304">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:53.750522" elapsed="0.010613">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:53.750352" elapsed="0.010837">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:53.749921" elapsed="0.011358">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:53.761569" elapsed="0.000028"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:53.724076" elapsed="0.037618">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:54.783899" elapsed="0.000238"/>
</kw>
<msg time="2026-04-11T00:50:54.784205" 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-11T00:50:54.783242" elapsed="0.001028"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:54.782780" elapsed="0.001569"/>
</kw>
<msg time="2026-04-11T00:50:54.784505" 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-11T00:50:54.774800" elapsed="0.009752"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:54.774374" elapsed="0.010252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:54.785102" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:54.784815" elapsed="0.000334"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:54.790307" 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-11T00:50:54.789923" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:54.790797" 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-11T00:50:54.790509" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:54.790869" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:54.791026" 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-11T00:50:54.789553" elapsed="0.001498"/>
</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-11T00:50:54.791202" elapsed="0.000151"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:54.791858" level="INFO">${ds_type} = operational</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-11T00:50:54.791526" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:54.792277" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:54.792039" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:54.792707" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:54.792464" elapsed="0.000269"/>
</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-11T00:50:54.793139" 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-11T00:50:54.793406" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:54.793245" 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-11T00:50:54.793628" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:54.793488" elapsed="0.000194"/>
</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-11T00:50:54.793846" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:54.793706" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:54.793227" elapsed="0.000694"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:54.792959" elapsed="0.000985"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:54.792779" elapsed="0.001190"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:54.794007" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:54.794205" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:54.794252" 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-11T00:50:54.788810" elapsed="0.005466"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:54.794728" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:54.794806" 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-11T00:50:54.794460" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:54.795405" 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-11T00:50:54.795113" elapsed="0.000362">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:54.794899" elapsed="0.000641">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:54.794881" elapsed="0.000736">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-11T00:50:54.795776" elapsed="0.000023"/>
</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-11T00:50:54.795951" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:54.796017" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:54.786157" elapsed="0.009966">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:54.785926" elapsed="0.010267">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:54.785787" elapsed="0.010462">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:54.785377" elapsed="0.010963">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:54.796586" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:54.762368" elapsed="0.034335">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:55.822570" elapsed="0.000238"/>
</kw>
<msg time="2026-04-11T00:50:55.822878" 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-11T00:50:55.821911" elapsed="0.001045"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:55.821450" elapsed="0.001592"/>
</kw>
<msg time="2026-04-11T00:50:55.823088" 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-11T00:50:55.813338" elapsed="0.009794"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:55.812920" elapsed="0.010286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:55.823672" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:55.823415" elapsed="0.000302"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:55.828719" 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-11T00:50:55.828298" elapsed="0.000448"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:55.829188" 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-11T00:50:55.828906" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:55.829261" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:55.829435" 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-11T00:50:55.827927" elapsed="0.001533"/>
</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-11T00:50:55.829611" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:55.830257" level="INFO">${ds_type} = operational</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-11T00:50:55.829925" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:55.830699" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:55.830458" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:55.831103" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:55.830871" 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-11T00:50:55.831556" 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-11T00:50:55.831897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:55.831748" 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-11T00:50:55.832118" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:55.831978" 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-11T00:50:55.832337" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:55.832196" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:55.831727" elapsed="0.000700"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:55.831373" elapsed="0.001078"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:55.831175" elapsed="0.001301"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:55.832516" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:55.832743" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:55.832788" 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-11T00:50:55.827205" elapsed="0.005606"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:55.834877" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:55.834959" 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-11T00:50:55.832979" elapsed="0.002005"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:55.835584" 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-11T00:50:55.835277" elapsed="0.000397">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:55.835056" elapsed="0.000691">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:55.835037" elapsed="0.000742">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-11T00:50:55.835933" 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-11T00:50:55.836106" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:55.836172" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:55.824738" elapsed="0.011539">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:55.824493" elapsed="0.011854">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:55.824337" elapsed="0.012082">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:55.823941" elapsed="0.012568">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:55.836754" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:55.797623" elapsed="0.039245">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:56.861713" elapsed="0.000238"/>
</kw>
<msg time="2026-04-11T00:50:56.862017" 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-11T00:50:56.861019" elapsed="0.001062"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:56.860502" elapsed="0.001657"/>
</kw>
<msg time="2026-04-11T00:50:56.862206" 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-11T00:50:56.852330" elapsed="0.009921"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:56.851820" elapsed="0.010506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:56.862908" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:56.862645" elapsed="0.000309"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:56.868157" 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-11T00:50:56.867765" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:56.868644" 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-11T00:50:56.868341" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:56.868716" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:56.868873" 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-11T00:50:56.867394" elapsed="0.001503"/>
</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-11T00:50:56.869048" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:56.869721" level="INFO">${ds_type} = operational</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-11T00:50:56.869363" elapsed="0.000385"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:56.870143" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:56.869904" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:56.870574" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:56.870313" elapsed="0.000286"/>
</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-11T00:50:56.871002" 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-11T00:50:56.871257" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:56.871109" 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-11T00:50:56.871496" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:56.871338" elapsed="0.000213"/>
</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-11T00:50:56.871717" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:56.871575" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:56.871091" elapsed="0.000703"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:56.870836" elapsed="0.000982"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:56.870646" elapsed="0.001198"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:56.871883" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:56.872109" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:56.872157" 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-11T00:50:56.866673" elapsed="0.005508"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:56.872641" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:56.872717" 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-11T00:50:56.872354" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:56.873308" 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-11T00:50:56.873024" elapsed="0.000369">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:56.872809" elapsed="0.000653">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:56.872791" elapsed="0.000704">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-11T00:50:56.873648" 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-11T00:50:56.873819" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:56.873884" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:56.863977" elapsed="0.010051">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:56.863744" elapsed="0.010354">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:56.863602" elapsed="0.010550">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:56.863186" elapsed="0.011056">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:56.874492" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:56.837780" elapsed="0.036830">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:57.901538" elapsed="0.000241"/>
</kw>
<msg time="2026-04-11T00:50:57.901845" 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-11T00:50:57.900877" elapsed="0.001031"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:57.900415" elapsed="0.001573"/>
</kw>
<msg time="2026-04-11T00:50:57.902035" 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-11T00:50:57.892254" elapsed="0.009826"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:57.891548" elapsed="0.010608"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:57.902628" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:57.902353" elapsed="0.000321"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:57.907677" 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-11T00:50:57.907258" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:57.908159" 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-11T00:50:57.907863" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:57.908233" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:57.908402" 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-11T00:50:57.906888" elapsed="0.001541"/>
</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-11T00:50:57.908579" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:57.909218" level="INFO">${ds_type} = operational</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-11T00:50:57.908889" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:57.909654" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:57.909415" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:57.910058" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:57.909824" 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-11T00:50:57.910499" 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-11T00:50:57.910752" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:57.910606" 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-11T00:50:57.910971" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:57.910831" elapsed="0.000282"/>
</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-11T00:50:57.911285" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:57.911139" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:57.910588" elapsed="0.000773"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:57.910311" elapsed="0.001089"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:57.910130" elapsed="0.001298"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:57.911468" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:57.911697" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:57.911744" 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-11T00:50:57.906161" elapsed="0.005607"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:57.912210" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:57.912288" 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-11T00:50:57.911939" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:57.913087" 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-11T00:50:57.912615" elapsed="0.000543">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:57.912398" elapsed="0.000827">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:57.912364" elapsed="0.000895">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-11T00:50:57.913427" 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-11T00:50:57.913603" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:57.913669" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:57.903702" elapsed="0.010075">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:57.903461" elapsed="0.010387">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:57.903299" elapsed="0.010605">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:57.902906" elapsed="0.011088">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:57.914226" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:57.875740" elapsed="0.038603">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:58.942019" elapsed="0.000235"/>
</kw>
<msg time="2026-04-11T00:50:58.942319" 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-11T00:50:58.941348" elapsed="0.001059"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:58.940880" elapsed="0.001611"/>
</kw>
<msg time="2026-04-11T00:50:58.942538" 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-11T00:50:58.931571" elapsed="0.011011"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:58.930874" elapsed="0.011784"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:58.943126" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:58.942854" elapsed="0.000319"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:58.948320" 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-11T00:50:58.947932" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:58.948812" 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-11T00:50:58.948524" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:58.948886" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:50:58.949045" 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-11T00:50:58.947557" elapsed="0.001513"/>
</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-11T00:50:58.949223" elapsed="0.000170"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:58.949887" level="INFO">${ds_type} = operational</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-11T00:50:58.949554" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:58.950541" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:58.950071" elapsed="0.000497"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:58.950958" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:58.950718" elapsed="0.000266"/>
</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-11T00:50:58.951420" elapsed="0.000026"/>
</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-11T00:50:58.951677" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:58.951530" 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-11T00:50:58.951897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:58.951757" elapsed="0.000194"/>
</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-11T00:50:58.952114" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:58.951974" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:58.951511" elapsed="0.000677"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:58.951237" elapsed="0.000975"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:58.951032" elapsed="0.001206"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:58.952277" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:50:58.952492" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:58.952538" 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-11T00:50:58.946789" elapsed="0.005772"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:58.953005" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:58.953081" 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-11T00:50:58.952734" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:58.953691" 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-11T00:50:58.953407" elapsed="0.000356">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:58.953173" elapsed="0.000657">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:58.953155" elapsed="0.000706">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-11T00:50:58.954011" 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-11T00:50:58.954182" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:58.954247" elapsed="0.000016"/>
</return>
<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>
<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-11T00:50:58.944193" elapsed="0.010160">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:58.943961" elapsed="0.010479">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:58.943820" elapsed="0.010675">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:58.943423" elapsed="0.011207">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:58.954863" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:58.915217" elapsed="0.039763">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:50:59.983166" elapsed="0.000252"/>
</kw>
<msg time="2026-04-11T00:50:59.983483" 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-11T00:50:59.982502" elapsed="0.001044"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:59.982030" elapsed="0.001595"/>
</kw>
<msg time="2026-04-11T00:50:59.983671" 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-11T00:50:59.973957" elapsed="0.009765"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:50:59.973545" elapsed="0.010251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:50:59.984242" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:50:59.983987" elapsed="0.000302"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:50:59.989531" 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-11T00:50:59.989130" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:59.990006" 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-11T00:50:59.989719" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:50:59.990081" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:50:59.990237" 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-11T00:50:59.988756" elapsed="0.001506"/>
</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-11T00:50:59.990430" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:50:59.991099" level="INFO">${ds_type} = operational</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-11T00:50:59.990762" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:59.991539" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:59.991281" elapsed="0.000284"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:50:59.991949" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:50:59.991711" elapsed="0.000264"/>
</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-11T00:50:59.992368" elapsed="0.000039"/>
</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-11T00:50:59.992636" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:59.992490" 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-11T00:50:59.992855" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:59.992716" 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-11T00:50:59.993077" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:50:59.992932" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:50:59.992472" elapsed="0.000678"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:50:59.992203" elapsed="0.000970"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:59.992021" elapsed="0.001243"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:50:59.993308" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:50:59.993529" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:50:59.993576" 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-11T00:50:59.988031" elapsed="0.005569"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:50:59.994036" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:50:59.994114" 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-11T00:50:59.993769" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:50:59.994738" 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-11T00:50:59.994436" elapsed="0.000371">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:50:59.994207" elapsed="0.000665">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:50:59.994189" elapsed="0.000716">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-11T00:50:59.995056" 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-11T00:50:59.995227" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:50:59.995294" elapsed="0.000015"/>
</return>
<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>
<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-11T00:50:59.985285" elapsed="0.010129">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:50:59.985056" elapsed="0.010430">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:50:59.984918" elapsed="0.010624">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:50:59.984528" elapsed="0.011104">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:50:59.995863" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:50:59.955912" elapsed="0.040065">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:01.020659" elapsed="0.000241"/>
</kw>
<msg time="2026-04-11T00:51:01.020969" 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-11T00:51:01.019950" elapsed="0.001084"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:01.019488" elapsed="0.001624"/>
</kw>
<msg time="2026-04-11T00:51:01.021157" 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-11T00:51:01.011417" elapsed="0.009784"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:01.010981" elapsed="0.010294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:01.021740" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:01.021484" elapsed="0.000300"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:01.026792" 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-11T00:51:01.026406" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:01.027258" 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-11T00:51:01.026976" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:01.027425" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:51:01.027590" 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-11T00:51:01.026000" elapsed="0.001615"/>
</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-11T00:51:01.027807" elapsed="0.000171"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:01.028516" level="INFO">${ds_type} = operational</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-11T00:51:01.028141" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:01.028941" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:01.028703" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:01.029347" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:01.029111" elapsed="0.000261"/>
</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-11T00:51:01.029782" 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-11T00:51:01.030072" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:01.029909" elapsed="0.000252"/>
</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-11T00:51:01.030332" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:01.030187" elapsed="0.000221"/>
</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-11T00:51:01.030576" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:01.030434" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:01.029883" elapsed="0.000767"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:01.029617" elapsed="0.001057"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:01.029435" elapsed="0.001264"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:01.030740" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:51:01.030941" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:01.030986" 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-11T00:51:01.025282" elapsed="0.005727"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:01.031461" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:01.031539" 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-11T00:51:01.031177" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:01.032310" 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-11T00:51:01.032023" elapsed="0.000373">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:01.031630" elapsed="0.000837">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:01.031612" elapsed="0.000887">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-11T00:51:01.032651" 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-11T00:51:01.032824" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:01.032889" elapsed="0.000016"/>
</return>
<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>
<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-11T00:51:01.022805" elapsed="0.010190">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:01.022572" elapsed="0.010509">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:01.022427" elapsed="0.010730">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:01.022007" elapsed="0.011266">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:01.033557" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:00.996907" elapsed="0.036821">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:02.060078" elapsed="0.000243"/>
</kw>
<msg time="2026-04-11T00:51:02.060403" 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-11T00:51:02.059424" elapsed="0.001048"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:02.058949" elapsed="0.001602"/>
</kw>
<msg time="2026-04-11T00:51:02.060597" 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-11T00:51:02.050874" elapsed="0.009767"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:02.050447" elapsed="0.010268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:02.061161" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:02.060907" elapsed="0.000298"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:02.066420" 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-11T00:51:02.066012" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:02.066900" 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-11T00:51:02.066615" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:02.066975" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:51:02.067132" 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-11T00:51:02.065637" elapsed="0.001519"/>
</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-11T00:51:02.067323" elapsed="0.000169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:02.067997" level="INFO">${ds_type} = operational</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-11T00:51:02.067665" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:02.068428" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:02.068177" elapsed="0.000278"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:02.068852" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:02.068601" elapsed="0.000276"/>
</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-11T00:51:02.069265" 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-11T00:51:02.069599" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:02.069373" elapsed="0.000320"/>
</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-11T00:51:02.069862" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:02.069720" 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-11T00:51:02.070080" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:02.069939" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:02.069354" elapsed="0.000799"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:02.069102" elapsed="0.001076"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:02.068922" elapsed="0.001283"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:02.070245" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:51:02.070464" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:02.070510" 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-11T00:51:02.064899" elapsed="0.005634"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:02.071052" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:02.071130" 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-11T00:51:02.070780" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:02.071739" 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-11T00:51:02.071456" elapsed="0.000353">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:02.071224" elapsed="0.000650">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:02.071206" elapsed="0.000700">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-11T00:51:02.072059" 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-11T00:51:02.072233" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:02.072299" elapsed="0.000016"/>
</return>
<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>
<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-11T00:51:02.062238" elapsed="0.010187">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:02.062003" elapsed="0.010499">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:02.061855" elapsed="0.010703">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:02.061444" elapsed="0.011204">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:02.072879" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:02.035266" elapsed="0.037728">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:03.099889" elapsed="0.000237"/>
</kw>
<msg time="2026-04-11T00:51:03.100193" 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-11T00:51:03.099228" elapsed="0.001032"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:03.098772" elapsed="0.001565"/>
</kw>
<msg time="2026-04-11T00:51:03.100396" 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-11T00:51:03.089516" elapsed="0.010927"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:03.088915" elapsed="0.011601"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:03.100962" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:03.100708" elapsed="0.000298"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:03.107006" 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-11T00:51:03.105652" elapsed="0.001403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:03.107570" 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-11T00:51:03.107256" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:03.107645" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:51:03.107813" 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-11T00:51:03.105264" elapsed="0.002574"/>
</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-11T00:51:03.107993" elapsed="0.000160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:03.108658" level="INFO">${ds_type} = operational</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-11T00:51:03.108309" elapsed="0.000375"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:03.109214" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:03.108959" elapsed="0.000281"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:03.109649" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:03.109401" elapsed="0.000274"/>
</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-11T00:51:03.110083" 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-11T00:51:03.110336" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:03.110190" elapsed="0.000223"/>
</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-11T00:51:03.110586" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:03.110444" 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-11T00:51:03.110803" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:03.110664" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:03.110171" elapsed="0.000706"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:03.109916" elapsed="0.000985"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:03.109727" elapsed="0.001200"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:03.110967" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:03.111175" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:03.111221" 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-11T00:51:03.104537" elapsed="0.006707"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:03.111893" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:03.111972" 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-11T00:51:03.111435" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:03.112596" 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-11T00:51:03.112290" elapsed="0.000385">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:03.112068" elapsed="0.000674">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:03.112049" elapsed="0.000725">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-11T00:51:03.112925" elapsed="0.000023"/>
</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-11T00:51:03.113098" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:03.113182" elapsed="0.000017"/>
</return>
<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>
<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-11T00:51:03.102036" elapsed="0.011256">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:03.101809" elapsed="0.011551">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:03.101659" elapsed="0.011783">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:03.101252" elapsed="0.012284">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:03.113766" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:03.073892" elapsed="0.039987">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:04.140036" elapsed="0.000248"/>
</kw>
<msg time="2026-04-11T00:51:04.140356" 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-11T00:51:04.139376" elapsed="0.001062"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:04.138919" elapsed="0.001706"/>
</kw>
<msg time="2026-04-11T00:51:04.140692" 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-11T00:51:04.129859" elapsed="0.010884"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:04.129271" elapsed="0.011547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:04.141268" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:04.141009" elapsed="0.000305"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:04.146630" 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-11T00:51:04.146222" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:04.147102" 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-11T00:51:04.146818" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:04.147175" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:51:04.147333" 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-11T00:51:04.145840" elapsed="0.001517"/>
</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-11T00:51:04.147525" elapsed="0.000160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:04.148172" level="INFO">${ds_type} = operational</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-11T00:51:04.147843" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:04.148622" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:04.148352" elapsed="0.000308"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:04.149045" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:04.148812" elapsed="0.000259"/>
</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-11T00:51:04.149475" 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-11T00:51:04.149728" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:04.149581" 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-11T00:51:04.149945" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:04.149807" elapsed="0.000192"/>
</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-11T00:51:04.150160" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:04.150022" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:04.149563" elapsed="0.000669"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:04.149296" elapsed="0.000960"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:04.149117" elapsed="0.001164"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:04.150320" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:51:04.150533" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:04.150579" 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-11T00:51:04.145111" elapsed="0.005491"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:04.151040" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:04.151115" 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-11T00:51:04.150776" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:04.151711" 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-11T00:51:04.151432" elapsed="0.000350">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:04.151205" elapsed="0.001270">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:04.151187" elapsed="0.001323">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-11T00:51:04.152676" elapsed="0.000023"/>
</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-11T00:51:04.152857" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:04.152923" elapsed="0.000015"/>
</return>
<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>
<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-11T00:51:04.142320" elapsed="0.010709">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:04.142091" elapsed="0.011008">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:04.141949" elapsed="0.011206">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:04.141557" elapsed="0.011688">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:04.153489" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:04.114793" elapsed="0.038812">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:05.182155" elapsed="0.000253"/>
</kw>
<msg time="2026-04-11T00:51:05.182475" 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-11T00:51:05.181493" elapsed="0.001048"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:05.181007" elapsed="0.001613"/>
</kw>
<msg time="2026-04-11T00:51:05.182666" 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-11T00:51:05.172903" elapsed="0.009806"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:05.172488" elapsed="0.010295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:05.183239" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:05.182979" elapsed="0.000305"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:05.188365" 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-11T00:51:05.187966" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:05.188853" 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-11T00:51:05.188568" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:05.188927" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:51:05.189084" 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-11T00:51:05.187598" elapsed="0.001510"/>
</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-11T00:51:05.189257" elapsed="0.000171"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:05.189917" level="INFO">${ds_type} = operational</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-11T00:51:05.189585" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:05.190339" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:05.190101" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:05.190762" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:05.190527" 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-11T00:51:05.191259" 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-11T00:51:05.191533" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:05.191368" 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-11T00:51:05.191751" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:05.191613" elapsed="0.000192"/>
</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-11T00:51:05.191969" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:05.191829" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:05.191348" elapsed="0.000694"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:05.191011" elapsed="0.001055"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:05.190833" elapsed="0.001259"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:05.192132" elapsed="0.000051"/>
</return>
<msg time="2026-04-11T00:51:05.192361" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:05.192423" 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-11T00:51:05.186874" elapsed="0.005573"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:05.192924" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:05.193000" 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-11T00:51:05.192635" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:05.193790" 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-11T00:51:05.193305" elapsed="0.000558">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:05.193092" elapsed="0.000838">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:05.193074" elapsed="0.000889">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-11T00:51:05.194116" 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-11T00:51:05.194287" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:05.194351" elapsed="0.000015"/>
</return>
<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>
<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-11T00:51:05.184343" elapsed="0.010128">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:05.184100" elapsed="0.010438">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:05.183958" elapsed="0.010633">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:05.183528" elapsed="0.011151">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:05.194905" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:05.154540" elapsed="0.040480">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:06.220493" elapsed="0.000237"/>
</kw>
<msg time="2026-04-11T00:51:06.220795" 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-11T00:51:06.219834" elapsed="0.001024"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:06.219310" elapsed="0.001627"/>
</kw>
<msg time="2026-04-11T00:51:06.220982" 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-11T00:51:06.210367" elapsed="0.010659"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:06.209807" elapsed="0.011391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:06.221667" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:06.221403" elapsed="0.000309"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:06.226817" 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-11T00:51:06.226430" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:06.227296" 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-11T00:51:06.227006" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:06.227370" elapsed="0.000050"/>
</return>
<msg time="2026-04-11T00:51:06.227549" 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-11T00:51:06.226040" elapsed="0.001534"/>
</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-11T00:51:06.227739" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:06.228413" level="INFO">${ds_type} = operational</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-11T00:51:06.228056" elapsed="0.000387"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:06.229034" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:06.228600" elapsed="0.000462"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:06.229474" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:06.229213" elapsed="0.000288"/>
</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-11T00:51:06.229941" 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-11T00:51:06.230196" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:06.230049" 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-11T00:51:06.230433" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:06.230276" 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-11T00:51:06.230660" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:06.230513" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:06.230030" elapsed="0.000703"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:06.229771" elapsed="0.000986"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:06.229549" elapsed="0.001233"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:06.230822" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:06.231021" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:06.231068" 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-11T00:51:06.225268" elapsed="0.005823"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:06.231547" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:06.231625" 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-11T00:51:06.231260" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:06.232235" 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-11T00:51:06.231953" elapsed="0.000353">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:06.231734" elapsed="0.000638">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:06.231716" elapsed="0.000704">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-11T00:51:06.232573" 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-11T00:51:06.232747" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:06.232854" elapsed="0.000017"/>
</return>
<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>
<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-11T00:51:06.222737" elapsed="0.010225">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:06.222482" elapsed="0.010550">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:06.222325" elapsed="0.010761">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:06.221935" elapsed="0.011240">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:06.233425" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:06.195956" elapsed="0.037587">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:07.258011" elapsed="0.000268"/>
</kw>
<msg time="2026-04-11T00:51:07.258360" 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-11T00:51:07.257334" elapsed="0.001121"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:07.256857" elapsed="0.001684"/>
</kw>
<msg time="2026-04-11T00:51:07.258589" 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-11T00:51:07.248714" elapsed="0.009920"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:07.248267" elapsed="0.010441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:07.259188" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:07.258916" elapsed="0.000319"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:07.264619" 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-11T00:51:07.264212" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:07.265094" 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-11T00:51:07.264809" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:07.265170" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:51:07.265336" 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-11T00:51:07.263838" elapsed="0.001522"/>
</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-11T00:51:07.265530" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:07.266176" level="INFO">${ds_type} = operational</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-11T00:51:07.265846" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:07.266615" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:07.266359" elapsed="0.000282"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:07.267020" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:07.266787" elapsed="0.000258"/>
</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-11T00:51:07.267485" 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-11T00:51:07.267754" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:07.267600" elapsed="0.000317"/>
</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-11T00:51:07.268093" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:07.267948" 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-11T00:51:07.268313" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:07.268171" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:07.267579" elapsed="0.000822"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:07.267300" elapsed="0.001129"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:07.267091" elapsed="0.001367"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:07.268499" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:07.268703" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:07.268748" 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-11T00:51:07.263095" elapsed="0.005677"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:07.269220" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:07.269297" 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-11T00:51:07.268944" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:07.269924" 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-11T00:51:07.269626" elapsed="0.000379">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:07.269407" elapsed="0.000671">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:07.269372" elapsed="0.000738">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-11T00:51:07.270262" 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-11T00:51:07.270460" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:07.270529" elapsed="0.000016"/>
</return>
<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>
<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-11T00:51:07.260308" elapsed="0.010333">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:07.260052" elapsed="0.010659">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:07.259893" elapsed="0.010874">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:07.259484" elapsed="0.011372">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:07.271088" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:07.234515" elapsed="0.036699">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:08.295711" elapsed="0.000248"/>
</kw>
<msg time="2026-04-11T00:51:08.296029" 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-11T00:51:08.295046" elapsed="0.001050"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:08.294570" elapsed="0.001607"/>
</kw>
<msg time="2026-04-11T00:51:08.296223" 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-11T00:51:08.285869" elapsed="0.010398"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:08.285242" elapsed="0.011101"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:08.296808" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:08.296551" elapsed="0.000301"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:08.301973" 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-11T00:51:08.301584" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:08.302464" 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-11T00:51:08.302158" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:08.302539" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:51:08.302710" 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-11T00:51:08.301201" elapsed="0.001534"/>
</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-11T00:51:08.302891" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:08.303550" level="INFO">${ds_type} = operational</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-11T00:51:08.303202" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:08.303970" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:08.303731" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:08.304375" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:08.304141" 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-11T00:51:08.304812" 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-11T00:51:08.305066" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:08.304918" 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-11T00:51:08.305284" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:08.305146" elapsed="0.000191"/>
</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-11T00:51:08.305517" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:08.305360" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:08.304900" elapsed="0.000691"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:08.304642" elapsed="0.000974"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:08.304464" elapsed="0.001177"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:08.305681" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:08.305881" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:08.305927" 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-11T00:51:08.300496" elapsed="0.005455"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:08.306402" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:08.306481" 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-11T00:51:08.306118" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:08.307268" 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-11T00:51:08.306798" elapsed="0.000545">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:08.306573" elapsed="0.000853">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:08.306556" elapsed="0.000904">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-11T00:51:08.307615" 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-11T00:51:08.307789" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:08.307855" elapsed="0.000015"/>
</return>
<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>
<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-11T00:51:08.297977" elapsed="0.009983">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:08.297742" elapsed="0.010331">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:08.297595" elapsed="0.010534">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:08.297178" elapsed="0.011040">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:08.308463" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:08.271936" elapsed="0.036643">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:09.335195" elapsed="0.000247"/>
</kw>
<msg time="2026-04-11T00:51:09.335506" 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-11T00:51:09.334544" elapsed="0.001025"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:09.334040" elapsed="0.001607"/>
</kw>
<msg time="2026-04-11T00:51:09.335694" 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-11T00:51:09.325906" elapsed="0.009833"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:09.325495" elapsed="0.010319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:09.336259" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:09.336002" elapsed="0.000302"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:09.341356" 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-11T00:51:09.340971" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:09.341848" 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-11T00:51:09.341560" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:09.341922" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:51:09.342080" 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-11T00:51:09.340592" elapsed="0.001513"/>
</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-11T00:51:09.342271" elapsed="0.000170"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:09.343170" level="INFO">${ds_type} = operational</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-11T00:51:09.342626" elapsed="0.000572"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:09.343623" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:09.343358" elapsed="0.000292"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:09.344045" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:09.343807" elapsed="0.000264"/>
</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-11T00:51:09.344486" 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-11T00:51:09.344742" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:09.344594" 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-11T00:51:09.344965" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:09.344824" 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-11T00:51:09.345184" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:09.345043" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:09.344575" elapsed="0.000760"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:09.344303" elapsed="0.001056"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:09.344119" elapsed="0.001280"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:09.345440" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:51:09.345644" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:09.345691" 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-11T00:51:09.339863" elapsed="0.005852"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:09.346157" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:09.346274" 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-11T00:51:09.345886" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:09.346931" 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-11T00:51:09.346614" elapsed="0.000389">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:09.346378" elapsed="0.000693">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:09.346359" elapsed="0.000746">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-11T00:51:09.347260" elapsed="0.000023"/>
</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-11T00:51:09.347455" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:09.347523" elapsed="0.000017"/>
</return>
<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>
<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-11T00:51:09.337346" elapsed="0.010287">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:09.337116" elapsed="0.010589">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:09.336976" elapsed="0.010785">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:09.336552" elapsed="0.011301">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:09.348089" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:09.309500" elapsed="0.038708">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:10.372838" elapsed="0.000240"/>
</kw>
<msg time="2026-04-11T00:51:10.373147" 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-11T00:51:10.372170" elapsed="0.001044"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:10.371712" elapsed="0.001579"/>
</kw>
<msg time="2026-04-11T00:51:10.373336" 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-11T00:51:10.363671" elapsed="0.009709"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:10.363257" elapsed="0.010212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:10.373932" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:10.373662" elapsed="0.000315"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:10.379223" 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-11T00:51:10.378836" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:10.379805" 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-11T00:51:10.379511" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:10.379886" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:51:10.380046" 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-11T00:51:10.378465" elapsed="0.001605"/>
</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-11T00:51:10.380222" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:10.380888" level="INFO">${ds_type} = operational</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-11T00:51:10.380554" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:10.381305" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:10.381070" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:10.381757" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:10.381493" elapsed="0.000291"/>
</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-11T00:51:10.382179" 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-11T00:51:10.382455" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:10.382290" elapsed="0.000222"/>
</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-11T00:51:10.382677" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:10.382538" elapsed="0.000192"/>
</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-11T00:51:10.382891" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:10.382753" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:10.382269" elapsed="0.000695"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:10.382013" elapsed="0.000976"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:10.381831" elapsed="0.001186"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:10.383056" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:51:10.383254" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:10.383299" 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-11T00:51:10.377739" elapsed="0.005584"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:10.383773" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:10.383849" 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-11T00:51:10.383505" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:10.384448" 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-11T00:51:10.384152" elapsed="0.000371">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:10.383940" elapsed="0.000649">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:10.383922" elapsed="0.000697">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-11T00:51:10.384768" 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-11T00:51:10.384938" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:10.385002" elapsed="0.000015"/>
</return>
<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>
<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-11T00:51:10.374988" elapsed="0.010118">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:10.374754" elapsed="0.010421">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:10.374610" elapsed="0.010620">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:10.374201" elapsed="0.011117">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:10.385561" elapsed="0.000059"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:10.349100" elapsed="0.036628">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:11.412208" elapsed="0.000254"/>
</kw>
<msg time="2026-04-11T00:51:11.412529" 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-11T00:51:11.411546" elapsed="0.001048"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:11.411037" elapsed="0.001637"/>
</kw>
<msg time="2026-04-11T00:51:11.412721" 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-11T00:51:11.402409" elapsed="0.010357"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:11.401854" elapsed="0.010986"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:11.413329" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:11.413038" elapsed="0.000337"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:11.418368" 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-11T00:51:11.417987" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:11.418854" 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-11T00:51:11.418569" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:11.418928" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:51:11.419086" 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-11T00:51:11.417619" elapsed="0.001491"/>
</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-11T00:51:11.419260" elapsed="0.000170"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:11.419915" level="INFO">${ds_type} = operational</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-11T00:51:11.419587" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:11.420329" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:11.420095" elapsed="0.000258"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:11.420746" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:11.420513" 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-11T00:51:11.421156" 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-11T00:51:11.421435" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:11.421273" 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-11T00:51:11.421655" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:11.421516" elapsed="0.000192"/>
</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-11T00:51:11.421873" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:11.421730" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:11.421254" elapsed="0.000692"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:11.420993" elapsed="0.000976"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:11.420816" elapsed="0.001180"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:11.422036" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:51:11.422231" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:11.422276" 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-11T00:51:11.416866" elapsed="0.005432"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:11.422819" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:11.422894" 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-11T00:51:11.422548" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:11.423681" 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-11T00:51:11.423393" elapsed="0.000361">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:11.423154" elapsed="0.000668">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:11.422968" elapsed="0.000886">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-11T00:51:11.424005" 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-11T00:51:11.424177" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:11.424243" elapsed="0.000015"/>
</return>
<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>
<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-11T00:51:11.414401" elapsed="0.009948">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:11.414152" elapsed="0.010282">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:11.414010" elapsed="0.010478">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:11.413618" elapsed="0.010957">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:11.424806" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:11.386682" elapsed="0.038240">No leader found.</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:12.451720" elapsed="0.000242"/>
</kw>
<msg time="2026-04-11T00:51:12.452031" 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-11T00:51:12.451061" elapsed="0.001036"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:12.450599" elapsed="0.001578"/>
</kw>
<msg time="2026-04-11T00:51:12.452223" 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-11T00:51:12.441292" elapsed="0.010975"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:12.440708" elapsed="0.011633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.453416" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:12.453140" elapsed="0.000323"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:12.458625" 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-11T00:51:12.458222" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.459094" 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-11T00:51:12.458811" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:12.459167" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:51:12.459324" 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-11T00:51:12.457853" elapsed="0.001495"/>
</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-11T00:51:12.459600" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.460251" level="INFO">${ds_type} = operational</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-11T00:51:12.459917" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.460691" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:12.460450" elapsed="0.000287"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.461125" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:12.460887" elapsed="0.000264"/>
</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-11T00:51:12.461559" 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-11T00:51:12.461814" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:12.461667" 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-11T00:51:12.462035" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:12.461896" elapsed="0.000194"/>
</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-11T00:51:12.462254" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:12.462114" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:12.461648" elapsed="0.000681"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:12.461378" elapsed="0.000975"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.461198" elapsed="0.001195"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:12.462436" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:12.462636" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:12.462683" 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-11T00:51:12.457127" elapsed="0.005579"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.463147" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:12.463224" 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-11T00:51:12.462880" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.463822" 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-11T00:51:12.463546" elapsed="0.000346">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:12.463316" elapsed="0.000640">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:12.463298" elapsed="0.000690">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-11T00:51:12.464138" 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-11T00:51:12.464309" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.464374" elapsed="0.000030"/>
</return>
<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>
<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-11T00:51:12.454467" elapsed="0.010028">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:12.454221" elapsed="0.010344">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:12.454080" elapsed="0.010540">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.453689" elapsed="0.011019">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.464951" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.425808" elapsed="0.039260">No leader found.</status>
</kw>
<msg time="2026-04-11T00:51:12.465152" level="FAIL">Keyword 'ClusterOpenFlow.Check OpenFlow Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: No leader found.</msg>
<arg>90s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check OpenFlow Shards Status</arg>
<arg>${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.993014" elapsed="90.472233">Keyword 'ClusterOpenFlow.Check OpenFlow Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: No leader found.</status>
</kw>
<doc>Check Shards Status after some cluster event.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.990790" elapsed="90.474620">Keyword 'ClusterOpenFlow.Check OpenFlow Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: No leader found.</status>
</kw>
<doc>Create original cluster list and check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:49:41.990277" elapsed="90.475279">Keyword 'ClusterOpenFlow.Check OpenFlow Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: No leader found.</status>
</test>
<test id="s1-s2-t36" name="Check Entity Owner Status After Start" line="184">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.500220" 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-11T00:51:12.499846" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.500725" 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-11T00:51:12.500419" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:12.500797" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:51:12.500955" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:12.499480" elapsed="0.001500"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:12.505472" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:12.505276" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:12.505646" elapsed="0.000186"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:12.506189" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:12.505983" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.506641" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:12.506394" elapsed="0.000287"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:12.506827" elapsed="0.000176"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:12.507355" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:12.507152" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.507809" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:12.507569" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.508337" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:12.507999" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.508790" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:12.508542" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.509260" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:12.508982" elapsed="0.000303"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:12.518092" elapsed="0.000220"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:12.526703" elapsed="0.000218"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.527517" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:12.527078" elapsed="0.000472"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:12.528748" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.528178" elapsed="0.000748">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.529236" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.527756" elapsed="0.001602">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.529552" elapsed="0.000073"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.529782" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.529957" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.530124" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.530289" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.530468" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.530636" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.530806" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.530966" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.531233" elapsed="0.000026"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.531492" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.531687" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:12.531103" elapsed="0.000665"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.531034" elapsed="0.000763"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.531937" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.531996" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.526181" elapsed="0.005925">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.532174" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.515867" elapsed="0.016408">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.532473" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.536708" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.536913" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.536980" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.504747" elapsed="0.032340">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:12.537200" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:12.537244" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:12.504173" elapsed="0.033094"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.537539" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:12.537405" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:12.537369" elapsed="0.000236"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:12.538917" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.539614" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:12.539282" elapsed="0.000358"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:12.540454" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.540163" elapsed="0.000380">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.540607" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.539824" elapsed="0.000902">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.540901" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.541076" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.541253" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.541440" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.541609" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.541775" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.541939" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.542110" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.542272" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.542553" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.542728" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.542890" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:12.542419" elapsed="0.000525"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.542337" elapsed="0.000633"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.543111" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.543171" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.538356" elapsed="0.004921">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:12.543403" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:12.543457" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:12.537755" elapsed="0.005725"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:12.544286" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.543776" elapsed="0.000572">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:12.543563" elapsed="0.000906">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:12.543544" elapsed="0.000960">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.544551" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.503634" elapsed="0.041015">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.544862" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.545030" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.545093" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:12.501271" elapsed="0.043923">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.545364" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.545563" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.545735" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.545898" elapsed="0.000023"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.546069" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:12.546232" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:12.546294" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.498833" elapsed="0.047577">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:13.579085" 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-11T00:51:13.578622" elapsed="0.000497"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:13.579604" 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-11T00:51:13.579289" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:13.579680" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:51:13.579849" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:13.578214" elapsed="0.001660"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:13.584509" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:13.584304" elapsed="0.000232"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:13.584687" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:13.585341" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:13.585128" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:13.585825" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:13.585569" elapsed="0.000299"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:13.586015" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:13.586570" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:13.586346" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:13.587007" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:13.586763" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:13.587562" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:13.587201" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:13.587996" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:13.587755" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:13.588508" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:13.588200" elapsed="0.000336"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:13.595066" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:13.603669" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:13.604460" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:13.604037" elapsed="0.000451"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:13.605619" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:13.605069" elapsed="0.000699">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:13.605929" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:13.604675" elapsed="0.001372">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.606226" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.606418" elapsed="0.000024"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.606599" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.606771" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.606939" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.607106" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.607272" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.607460" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.607637" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.607909" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.608137" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.608357" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:13.607779" elapsed="0.000676"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:13.607706" elapsed="0.000777"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.608678" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:13.608742" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:13.603164" elapsed="0.005692">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:13.608926" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:13.592854" elapsed="0.016176">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.609348" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.613603" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.613797" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:13.613864" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:13.583737" elapsed="0.030236">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:13.614087" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:13.614132" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:13.583161" elapsed="0.030994"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:13.614372" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:13.614244" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:13.614223" elapsed="0.000233"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:13.615763" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:13.616464" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:13.616129" elapsed="0.000362"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:13.617266" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:13.617005" elapsed="0.000351">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:13.617442" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:13.616671" elapsed="0.000875">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.617713" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.617881" elapsed="0.000019"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.618051" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.618216" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.618433" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.618598" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.618760" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.618926" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.619085" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.619335" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.619522" elapsed="0.000170"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.619843" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:13.619210" elapsed="0.000686"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:13.619148" elapsed="0.000775"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.620063" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:13.620123" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:13.615204" elapsed="0.005047">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:13.620365" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:13.620425" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:13.614607" elapsed="0.005842"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:13.621061" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:13.620743" elapsed="0.000379">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:13.620531" elapsed="0.000655">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:13.620512" elapsed="0.000707">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:13.621264" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:13.582610" elapsed="0.038752">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.621557" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.621723" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:13.621786" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:13.580169" elapsed="0.041716">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.622054" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.622236" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.622421" elapsed="0.000055"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.622625" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.622792" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:13.622957" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:13.623020" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:13.577445" elapsed="0.045675">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:14.657330" 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-11T00:51:14.656846" elapsed="0.000519"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:14.657851" 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-11T00:51:14.657554" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:14.657927" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:51:14.658100" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:14.656452" elapsed="0.001673"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:14.662734" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:14.662545" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:14.662914" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:14.663483" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:14.663257" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:14.663966" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:14.663706" elapsed="0.000303"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:14.664157" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:14.664711" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:14.664505" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:14.665148" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:14.664905" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:14.665888" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:14.665341" elapsed="0.000574"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:14.666324" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:14.666085" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:14.666822" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:14.666535" elapsed="0.000313"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:14.673190" elapsed="0.000225"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:14.681738" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:14.682522" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:14.682101" elapsed="0.000447"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:14.683782" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:14.683197" elapsed="0.000740">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:14.684099" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:14.682803" elapsed="0.001415">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.684407" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.684584" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.684758" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.684927" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.685089" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.685253" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.685431" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.685603" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.685765" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.686040" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.686264" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.686469" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:14.685907" elapsed="0.000646"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:14.685836" elapsed="0.000746"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.686724" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:14.686784" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:14.681235" elapsed="0.005656">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:14.686960" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:14.670985" elapsed="0.016075">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.687234" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.691365" elapsed="0.000083"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.691617" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:14.691733" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:14.661985" elapsed="0.029857">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:14.691954" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:14.691997" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:14.661425" elapsed="0.030595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:14.692225" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:14.692108" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:14.692088" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:14.693604" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:14.694268" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:14.693964" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:14.695111" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:14.694834" elapsed="0.000510">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:14.695435" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:14.694497" elapsed="0.001045">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.695741" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.695915" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.696091" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.696263" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.696446" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.696618" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.696784" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.696953" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.697116" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.697371" elapsed="0.000034"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.697556" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.697716" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:14.697245" elapsed="0.000524"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:14.697180" elapsed="0.000615"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.697936" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:14.697998" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:14.693052" elapsed="0.005052">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:14.698251" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:14.698296" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:14.692459" elapsed="0.005860"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:14.698945" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:14.698630" elapsed="0.000375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:14.698416" elapsed="0.000651">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:14.698396" elapsed="0.000704">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:14.699145" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:14.660852" elapsed="0.038391">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.699431" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.699597" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:14.699672" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:14.658440" elapsed="0.041333">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.699940" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.700116" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.700283" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.700458" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.700624" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:14.700787" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:14.700848" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:14.655572" elapsed="0.045375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:15.734028" 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-11T00:51:15.733536" elapsed="0.000528"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:15.734552" 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-11T00:51:15.734239" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:15.734627" elapsed="0.000048"/>
</return>
<msg time="2026-04-11T00:51:15.734808" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:15.733129" elapsed="0.001703"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:15.739548" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:15.739341" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:15.739725" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:15.740486" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:15.740070" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:15.740957" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:15.740700" elapsed="0.000300"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:15.741146" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:15.741707" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:15.741496" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:15.742150" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:15.741902" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:15.742700" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:15.742343" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:15.743132" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:15.742891" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:15.743642" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:15.743339" elapsed="0.000330"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:15.749948" elapsed="0.000216"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:15.758471" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:15.759241" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:15.758832" elapsed="0.000435"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:15.760425" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:15.759873" elapsed="0.000706">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:15.760740" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:15.759479" elapsed="0.001384">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.761035" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.761208" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.761395" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.761567" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.761729" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.761892" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.762061" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.762227" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.762403" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.762671" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.762935" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.763127" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:15.762544" elapsed="0.000677"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:15.762473" elapsed="0.000778"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.763407" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:15.763468" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:15.757966" elapsed="0.005608">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:15.763643" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:15.747783" elapsed="0.015960">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.763917" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.768149" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.768339" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:15.768463" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:15.738781" elapsed="0.029794">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:15.768686" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:15.768729" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:15.738211" elapsed="0.030541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:15.768955" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:15.768838" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:15.768817" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:15.770298" elapsed="0.000234"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:15.770982" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:15.770684" elapsed="0.000324"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:15.771828" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:15.771566" elapsed="0.000348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:15.771976" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:15.771210" elapsed="0.000874">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.772254" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.772477" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.772654" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.772823" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.772988" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.773150" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.773314" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.773497" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.773660" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.773913" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.774082" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.774241" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:15.773787" elapsed="0.000506"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:15.773723" elapsed="0.000596"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.774470" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:15.774531" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:15.769766" elapsed="0.004868">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:15.774745" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:15.774789" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:15.769168" elapsed="0.005643"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:15.775448" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:15.775106" elapsed="0.000404">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:15.774891" elapsed="0.000681">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:15.774873" elapsed="0.000730">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:15.775648" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:15.737663" elapsed="0.038081">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.775917" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.776082" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:15.776143" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:15.735244" elapsed="0.040996">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.776456" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.776634" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.776801" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.776961" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.777125" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:15.777287" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:15.777348" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:15.732314" elapsed="0.045148">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:16.808632" 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-11T00:51:16.808158" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:16.809131" 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-11T00:51:16.808835" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:16.809206" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:51:16.809377" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:16.807780" elapsed="0.001637"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:16.813961" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:16.813772" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:16.814141" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:16.814735" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:16.814497" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:16.815201" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:16.814947" elapsed="0.000295"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:16.815402" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:16.815937" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:16.815735" elapsed="0.000227"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:16.816370" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:16.816128" elapsed="0.000305"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:16.816923" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:16.816585" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:16.817344" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:16.817112" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:16.817832" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:16.817552" elapsed="0.000309"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:16.824259" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:16.832912" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:16.833672" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:16.833275" elapsed="0.001071"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:16.835840" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:16.835281" elapsed="0.000727">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:16.836170" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:16.834806" elapsed="0.001490">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.836487" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.836660" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.836833" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.836999" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.837168" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.837330" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.837508" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.837678" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.837839" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.838120" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.838343" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.838552" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:16.837990" elapsed="0.000643"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:16.837912" elapsed="0.000774"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.838838" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:16.838899" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:16.832425" elapsed="0.006585">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:16.839079" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:16.822075" elapsed="0.017103">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.839355" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.843549" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.843809" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:16.843878" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:16.813219" elapsed="0.030766">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:16.844105" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:16.844150" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:16.812667" elapsed="0.031506"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:16.844397" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:16.844261" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:16.844240" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:16.845787" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:16.846471" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:16.846150" elapsed="0.000347"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:16.847289" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:16.847028" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:16.847464" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:16.846692" elapsed="0.000876">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.847740" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.847913" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.848090" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.848264" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.848445" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.848612" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.848777" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.848946" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.849107" elapsed="0.000163"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.849538" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.849712" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.849874" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:16.849404" elapsed="0.000523"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:16.849317" elapsed="0.000636"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.850092" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:16.850151" elapsed="0.000050"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:16.845225" elapsed="0.005069">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:16.850420" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:16.850466" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:16.844616" elapsed="0.005873"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:16.851133" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:16.850808" elapsed="0.000385">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:16.850570" elapsed="0.000686">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:16.850552" elapsed="0.000737">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:16.851333" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:16.812101" elapsed="0.039345">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.851621" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.851785" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:16.851846" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:16.809713" elapsed="0.042233">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.852113" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.852289" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.852471" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.852633" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.852798" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:16.852959" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:16.853019" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:16.807020" elapsed="0.046098">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:17.878134" 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-11T00:51:17.877670" elapsed="0.000510"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:17.878780" 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-11T00:51:17.878479" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:17.878855" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:51:17.879026" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:17.877253" elapsed="0.001798"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:17.883717" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:17.883529" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:17.883902" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:17.884475" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:17.884245" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:17.884937" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:17.884684" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:17.885122" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:17.885843" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:17.885464" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:17.886317" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:17.886038" elapsed="0.000322"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:17.886876" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:17.886534" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:17.887304" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:17.887068" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:17.887792" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:17.887511" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:17.894065" elapsed="0.000221"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:17.902615" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:17.903415" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:17.902977" elapsed="0.000467"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:17.904577" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:17.904022" elapsed="0.000707">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:17.904906" elapsed="0.000024"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:17.903632" elapsed="0.001402">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.905210" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.905399" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.905576" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.905743" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.905906" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.906068" elapsed="0.000102"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.906324" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.906509" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.906672" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.906945" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.907172" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.907363" elapsed="0.000035"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:17.906817" elapsed="0.000645"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:17.906743" elapsed="0.000749"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.907638" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:17.907698" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:17.902101" elapsed="0.005704">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:17.907873" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:17.891900" elapsed="0.016072">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.908145" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.912291" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.912549" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:17.912617" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:17.882976" elapsed="0.029748">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:17.912839" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:17.912882" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:17.882377" elapsed="0.030528"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:17.913146" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:17.912997" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:17.912976" elapsed="0.000237"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:17.914557" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:17.915220" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:17.914918" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:17.918062" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:17.917786" elapsed="0.000431">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:17.918283" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:17.915441" elapsed="0.002962">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.918580" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.918755" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.918930" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.919101" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.919269" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.919449" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.919614" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.919785" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.919949" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.920209" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.920394" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.920557" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:17.920081" elapsed="0.000530"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:17.920015" elapsed="0.000622"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.920775" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:17.920836" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:17.913986" elapsed="0.006955">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:17.921054" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:17.921098" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:17.913364" elapsed="0.007758"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:17.921764" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:17.921439" elapsed="0.000386">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:17.921205" elapsed="0.000684">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:17.921186" elapsed="0.000736">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:17.921968" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:17.881738" elapsed="0.040327">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.922266" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.922491" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:17.922557" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:17.879347" elapsed="0.043311">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.922825" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.923003" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.923174" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.923335" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.923517" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:17.923681" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:17.923742" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:17.876447" elapsed="0.047395">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:18.954084" 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-11T00:51:18.953606" elapsed="0.000514"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:18.954605" 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-11T00:51:18.954289" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:18.954681" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:51:18.954849" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:18.953205" elapsed="0.001669"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:18.959471" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:18.959266" elapsed="0.000232"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:18.959651" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:18.960203" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:18.959995" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:18.960890" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:18.960428" elapsed="0.000505"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:18.961083" elapsed="0.000184"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:18.961672" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:18.961436" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:18.962118" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:18.961870" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:18.962743" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:18.962312" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:18.963172" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:18.962936" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:18.963664" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:18.963365" elapsed="0.000325"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:18.969991" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:18.978532" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:18.979278" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:18.978896" elapsed="0.000408"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:18.980465" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:18.979907" elapsed="0.000716">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:18.980786" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:18.979516" elapsed="0.001393">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.981081" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.981255" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.981448" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.981621" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.981822" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.981986" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.982151" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.982321" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.982499" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.982773" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.983002" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.983199" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:18.982644" elapsed="0.000635"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:18.982572" elapsed="0.000737"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.983468" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:18.983528" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:18.978029" elapsed="0.005605">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:18.983702" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:18.967793" elapsed="0.016007">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.984019" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.988151" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.988344" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:18.988467" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:18.958726" elapsed="0.029850">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:18.988688" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:18.988732" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:18.958154" elapsed="0.030600"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:18.988962" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:18.988842" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:18.988821" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:18.990338" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:18.991017" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:18.990717" elapsed="0.000325"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:18.991984" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:18.991572" elapsed="0.000499">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:18.992134" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:18.991221" elapsed="0.001017">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.992434" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.992610" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.992782" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.992950" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.993115" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.993277" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.993455" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.993658" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.993824" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.994076" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.994246" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.994421" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:18.993951" elapsed="0.000562"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:18.993888" elapsed="0.000652"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.994680" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:18.994740" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:18.989801" elapsed="0.005043">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:18.994955" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:18.994999" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:18.989182" elapsed="0.005839"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:18.995656" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:18.995319" elapsed="0.000398">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:18.995105" elapsed="0.000675">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:18.995084" elapsed="0.000728">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:18.995857" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:18.957578" elapsed="0.038375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.996127" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.996293" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:18.996355" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:18.955173" elapsed="0.041296">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.996638" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.996814" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.996982" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.997141" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.997306" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:18.997483" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:18.997547" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:18.952431" elapsed="0.045224">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:20.031468" 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-11T00:51:20.030983" elapsed="0.000519"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:20.031978" 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-11T00:51:20.031678" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:20.032054" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:51:20.032223" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:20.030588" elapsed="0.001663"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:20.036847" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:20.036657" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:20.037032" elapsed="0.000226"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:20.037649" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:20.037434" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:20.038125" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:20.037865" elapsed="0.000302"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:20.038314" elapsed="0.000414"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:20.039103" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:20.038889" elapsed="0.000242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:20.039571" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:20.039301" elapsed="0.000313"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:20.040116" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:20.039770" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:20.040571" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:20.040309" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:20.041052" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:20.040766" elapsed="0.000314"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:20.047447" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:20.056044" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:20.056833" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:20.056439" elapsed="0.000421"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:20.058014" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:20.057484" elapsed="0.000678">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:20.058323" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:20.057044" elapsed="0.001414">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.058638" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.058812" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.058988" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.059158" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.059404" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.059575" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.059742" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.059913" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.060076" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.060359" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.060608" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.060801" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:20.060229" elapsed="0.000653"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:20.060156" elapsed="0.000755"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.061056" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:20.061116" elapsed="0.000046"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:20.055555" elapsed="0.005702">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:20.061327" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:20.045249" elapsed="0.016200">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.061626" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.065767" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.065962" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:20.066027" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:20.036102" elapsed="0.030030">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:20.066246" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:20.066290" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:20.035552" elapsed="0.030760"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:20.066577" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:20.066452" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:20.066378" elapsed="0.000266"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:20.067940" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:20.068664" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:20.068340" elapsed="0.000350"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:20.069657" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:20.069221" elapsed="0.000524">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:20.069808" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:20.068872" elapsed="0.001040">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.070085" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.070260" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.070467" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.070642" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.070808" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.070973" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.071137" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.071305" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.071483" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.071738" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.071910" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.072070" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:20.071613" elapsed="0.000510"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:20.071548" elapsed="0.000601"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.072288" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:20.072347" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:20.067397" elapsed="0.005071">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:20.072581" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:20.072625" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:20.066794" elapsed="0.005854"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:20.073283" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:20.072941" elapsed="0.000402">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:20.072729" elapsed="0.000692">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:20.072711" elapsed="0.000744">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:20.073500" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:20.034992" elapsed="0.038606">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.073812" elapsed="0.000028"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.073986" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:20.074048" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:20.032569" elapsed="0.041577">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.074315" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.074510" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.074681" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.074844" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.075010" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:20.075173" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:20.075234" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:20.029774" elapsed="0.045559">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:21.105999" 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-11T00:51:21.105513" elapsed="0.000520"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:21.106524" 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-11T00:51:21.106209" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:21.106601" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:51:21.106772" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:21.105103" elapsed="0.001694"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:21.111996" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:21.111798" elapsed="0.000225"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:21.112175" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:21.112989" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:21.112541" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:21.113481" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:21.113206" elapsed="0.000317"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:21.113671" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:21.114207" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:21.114003" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:21.114742" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:21.114491" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:21.115282" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:21.114936" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:21.115727" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:21.115489" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:21.116203" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:21.115921" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:21.122622" elapsed="0.000215"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:21.131695" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:21.132506" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:21.132066" elapsed="0.000468"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:21.133833" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:21.133198" elapsed="0.000812">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:21.134182" elapsed="0.000029"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:21.132793" elapsed="0.001536">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.134525" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.134701" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.134876" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.135046" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.135210" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.135404" elapsed="0.000024"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.135575" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.135745" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.135906" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.136179" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.136437" elapsed="0.000028"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.136668" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:21.136048" elapsed="0.000706"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:21.135977" elapsed="0.000821"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.136982" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:21.137069" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:21.131159" elapsed="0.006026">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:21.137255" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:21.120366" elapsed="0.017059">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.137609" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.142339" elapsed="0.000036"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.142632" elapsed="0.000031"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:21.142726" elapsed="0.000023"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:21.111160" elapsed="0.031714">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:21.142995" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:21.143040" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:21.110448" elapsed="0.032614"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:21.143309" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:21.143154" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:21.143132" elapsed="0.000290"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:21.144981" elapsed="0.000228"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:21.145761" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:21.145366" elapsed="0.000421"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:21.146606" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:21.146320" elapsed="0.000375">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:21.146757" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:21.145973" elapsed="0.000888">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.147035" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.147206" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.147379" elapsed="0.000037"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.147594" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.147794" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.148007" elapsed="0.000029"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.148232" elapsed="0.000028"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.148449" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.148649" elapsed="0.000062"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.148983" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.149158" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.149321" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:21.148837" elapsed="0.000538"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:21.148763" elapsed="0.000657"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.149562" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:21.149620" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:21.144323" elapsed="0.005404">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:21.149841" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:21.149889" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:21.143582" elapsed="0.006338"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:21.150568" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:21.150227" elapsed="0.000403">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:21.150008" elapsed="0.000685">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:21.149989" elapsed="0.000736">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:21.150770" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:21.109788" elapsed="0.041080">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.151044" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.151211" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:21.151273" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:21.107094" elapsed="0.044279">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.151563" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.151742" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.151911" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.152073" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.152239" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:21.152416" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:21.152480" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:21.104215" elapsed="0.048420">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:22.184568" 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-11T00:51:22.184064" elapsed="0.000540"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:22.185070" 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-11T00:51:22.184773" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:22.185145" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:51:22.185322" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:22.183673" elapsed="0.001673"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:22.189941" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:22.189749" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:22.190121" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:22.190694" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:22.190480" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:22.191162" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:22.190904" elapsed="0.000300"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:22.191352" elapsed="0.000200"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:22.191913" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:22.191706" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:22.192411" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:22.192142" elapsed="0.000312"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:22.192945" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:22.192607" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:22.193368" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:22.193134" elapsed="0.000293"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:22.193857" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:22.193576" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:22.200311" elapsed="0.000231"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:22.208843" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:22.209616" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:22.209208" elapsed="0.000434"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:22.210772" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:22.210216" elapsed="0.000712">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:22.211089" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:22.209826" elapsed="0.001383">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.211398" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.211635" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.211815" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.211987" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.212189" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.212358" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.212542" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.212715" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.212876" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.213146" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.213395" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.213591" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:22.213019" elapsed="0.000654"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:22.212947" elapsed="0.000756"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.213846" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:22.213905" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:22.208342" elapsed="0.005671">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:22.214081" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:22.198109" elapsed="0.016070">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.214365" elapsed="0.000039"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.218624" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.218821" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:22.218887" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:22.189191" elapsed="0.029803">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:22.219107" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:22.219151" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:22.188639" elapsed="0.030534"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:22.219454" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:22.219304" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:22.219282" elapsed="0.000239"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:22.220852" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:22.221544" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:22.221220" elapsed="0.000351"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:22.222352" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:22.222087" elapsed="0.000380">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:22.222532" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:22.221752" elapsed="0.000885">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.222810" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.222982" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.223155" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.223324" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.223513" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.223687" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.223851" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.224020" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.224222" elapsed="0.000182"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.224657" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.224833" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.224996" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:22.224519" elapsed="0.000529"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:22.224454" elapsed="0.000621"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.225215" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:22.225274" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:22.220295" elapsed="0.005100">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:22.225512" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:22.225556" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:22.219674" elapsed="0.005904"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:22.226273" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:22.225930" elapsed="0.000404">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:22.225661" elapsed="0.000755">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:22.225641" elapsed="0.000845">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:22.226535" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:22.188048" elapsed="0.038585">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.226809" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.226974" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:22.227036" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:22.185675" elapsed="0.041460">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.227303" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.227494" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.227665" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.227826" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.227990" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:22.228168" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:22.228231" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:22.182867" elapsed="0.045464">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:23.261832" 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-11T00:51:23.261186" elapsed="0.000692"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:23.262501" 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-11T00:51:23.262116" elapsed="0.000412"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:23.262579" elapsed="0.000045"/>
</return>
<msg time="2026-04-11T00:51:23.262761" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:23.260670" elapsed="0.002116"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:23.268556" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:23.268271" elapsed="0.000325"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:23.268775" elapsed="0.000222"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:23.269421" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:23.269157" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:23.270014" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:23.269744" elapsed="0.000313"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:23.270207" elapsed="0.000234"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:23.271132" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:23.270638" elapsed="0.000529"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:23.271731" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:23.271379" elapsed="0.000408"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:23.272319" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:23.271968" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:23.272791" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:23.272545" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:23.273346" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:23.273002" elapsed="0.000378"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:23.280011" elapsed="0.000243"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:23.289130" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:23.289919" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:23.289519" elapsed="0.000427"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:23.291199" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:23.290594" elapsed="0.000823">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:23.291637" elapsed="0.000031"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:23.290143" elapsed="0.001672">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.292040" elapsed="0.000030"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.292252" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.292463" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.292636" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.292801" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.292965" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.293131" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.293300" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.293479" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.293792" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.294030" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.294224" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:23.293643" elapsed="0.000662"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:23.293552" elapsed="0.000783"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.294493" elapsed="0.000090"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:23.294638" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:23.288599" elapsed="0.006152">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:23.294821" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:23.277710" elapsed="0.017212">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.295103" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.300115" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.300314" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:23.300395" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:23.267516" elapsed="0.032988">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:23.300619" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:23.300663" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:23.266691" elapsed="0.033995"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:23.300916" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:23.300778" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:23.300755" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:23.302287" elapsed="0.000226"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:23.302968" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:23.302666" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:23.303814" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:23.303529" elapsed="0.000374">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:23.303966" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:23.303172" elapsed="0.000898">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.304242" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.304430" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.304607" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.304796" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.305035" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.305207" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.305370" elapsed="0.000037"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.305560" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.305722" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.305977" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.306147" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.306307" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:23.305850" elapsed="0.000510"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:23.305786" elapsed="0.000616"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.306543" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:23.306602" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:23.301748" elapsed="0.004961">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:23.306820" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:23.306864" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:23.301132" elapsed="0.005754"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:23.307524" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:23.307183" elapsed="0.000430">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:23.306967" elapsed="0.000714">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:23.306949" elapsed="0.000765">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:23.307758" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:23.265914" elapsed="0.041942">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.308032" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.308197" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:23.308258" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:23.263094" elapsed="0.045263">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.308547" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.308726" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.308894" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.309094" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.309264" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:23.309442" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:23.309505" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:23.259744" elapsed="0.049862">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:24.342149" 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-11T00:51:24.341687" elapsed="0.000494"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:24.342668" 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-11T00:51:24.342355" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:24.342743" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:51:24.342915" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:24.341267" elapsed="0.001674"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:24.347582" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:24.347376" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:24.347760" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:24.348311" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:24.348102" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:24.348789" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:24.348535" elapsed="0.000295"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:24.349010" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:24.349578" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:24.349354" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:24.350016" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:24.349771" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:24.350561" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:24.350207" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:24.350991" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:24.350755" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:24.351510" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:24.351208" elapsed="0.000329"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:24.358004" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:24.366616" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:24.367426" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:24.366980" elapsed="0.000475"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:24.368659" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:24.368109" elapsed="0.000701">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:24.368970" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:24.367711" elapsed="0.001381">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.369266" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.369455" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.369632" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.369803" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.369970" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.370134" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.370298" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.370481" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.370643" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.370917" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.371156" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.371348" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:24.370787" elapsed="0.000657"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:24.370713" elapsed="0.000762"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.371617" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:24.371677" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:24.366109" elapsed="0.005676">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:24.371855" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:24.355818" elapsed="0.016137">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.372131" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.376331" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.376586" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:24.376709" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:24.346819" elapsed="0.030000">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:24.376935" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:24.376979" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:24.346251" elapsed="0.030751"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:24.377228" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:24.377095" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:24.377072" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:24.378646" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:24.379357" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:24.379011" elapsed="0.000387"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:24.380194" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:24.379928" elapsed="0.000356">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:24.380352" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:24.379586" elapsed="0.000896">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.380655" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.380827" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.381002" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.381173" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.381347" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.381531" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.381699" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.381869" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.382034" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.382298" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.382483" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.382646" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:24.382170" elapsed="0.000528"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:24.382102" elapsed="0.000624"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.382866" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:24.382927" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:24.378081" elapsed="0.004954">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:24.383164" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:24.383264" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:24.377467" elapsed="0.005823"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:24.384185" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:24.383622" elapsed="0.000627">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:24.383376" elapsed="0.000938">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:24.383356" elapsed="0.000991">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:24.384409" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:24.345707" elapsed="0.038804">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.384687" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.384855" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:24.384919" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:24.343267" elapsed="0.041752">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.385188" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.385370" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.385558" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.385721" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.385886" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:24.386049" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:24.386109" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:24.340431" elapsed="0.045777">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:25.416084" 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-11T00:51:25.415622" elapsed="0.000495"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:25.416611" 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-11T00:51:25.416290" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:25.416686" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:51:25.416857" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:25.415213" elapsed="0.001669"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:25.421798" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:25.421600" elapsed="0.000225"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:25.421978" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:25.422553" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:25.422323" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:25.423051" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:25.422789" elapsed="0.000304"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:25.423240" elapsed="0.000204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:25.423808" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:25.423598" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:25.424251" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:25.424003" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:25.424804" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:25.424459" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:25.425280" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:25.424998" elapsed="0.000327"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:25.425780" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:25.425494" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:25.432422" elapsed="0.000220"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:25.441031" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:25.441806" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:25.441410" elapsed="0.000422"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:25.442983" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:25.442432" elapsed="0.000703">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:25.443297" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:25.442017" elapsed="0.001421">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.443612" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.443786" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.443962" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.444133" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.444327" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.444511" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.444677" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.444847" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.445009" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.445274" elapsed="0.000073"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.445571" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.445767" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:25.445147" elapsed="0.000701"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:25.445077" elapsed="0.000800"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.446019" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:25.446080" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:25.440541" elapsed="0.005647">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:25.446257" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:25.430140" elapsed="0.016218">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.446548" elapsed="0.000033"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.450743" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.450937" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:25.451003" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:25.420904" elapsed="0.030205">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:25.451221" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:25.451264" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:25.420310" elapsed="0.030977"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:25.451563" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:25.451373" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:25.451352" elapsed="0.000278"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:25.452926" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:25.453605" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:25.453284" elapsed="0.000347"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:25.454430" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:25.454150" elapsed="0.000370">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:25.454610" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:25.453813" elapsed="0.000907">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.454896" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.455109" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.455288" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.455483" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.455653" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.455819" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.455985" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.456158" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.456323" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.456599" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.456769" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.456927" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:25.456471" elapsed="0.000509"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:25.456402" elapsed="0.000604"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.457144" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:25.457203" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:25.452367" elapsed="0.004941">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:25.457434" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:25.457479" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:25.451779" elapsed="0.005723"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:25.458305" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:25.457802" elapsed="0.000564">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:25.457584" elapsed="0.000863">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:25.457565" elapsed="0.000915">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:25.458527" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:25.419736" elapsed="0.038902">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.458814" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.458979" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:25.459041" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:25.417268" elapsed="0.041871">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.459351" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.459549" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.459718" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.459879" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.460044" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:25.460209" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:25.460271" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:25.414429" elapsed="0.045940">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:26.492794" 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-11T00:51:26.492318" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:26.493296" 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-11T00:51:26.492998" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:26.493374" elapsed="0.000057"/>
</return>
<msg time="2026-04-11T00:51:26.493562" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:26.491935" elapsed="0.001652"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:26.498186" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:26.497969" elapsed="0.000244"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:26.498364" elapsed="0.000207"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:26.498935" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:26.498725" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:26.499412" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:26.499143" elapsed="0.000314"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:26.499604" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:26.500145" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:26.499938" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:26.500600" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:26.500338" elapsed="0.000304"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:26.501138" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:26.500795" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:26.501583" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:26.501330" elapsed="0.000297"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:26.502060" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:26.501778" elapsed="0.000323"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:26.508651" elapsed="0.000288"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:26.517334" elapsed="0.000232"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:26.518147" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:26.517723" elapsed="0.000451"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:26.519308" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:26.518780" elapsed="0.000700">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:26.519642" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:26.518360" elapsed="0.001399">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.519935" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.520108" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.520284" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.520476" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.520643" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.520807" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.520972" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.521142" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.521304" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.521590" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.521814" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.522004" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:26.521459" elapsed="0.000644"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:26.521372" elapsed="0.000762"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.522276" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:26.522337" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:26.516841" elapsed="0.005620">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:26.522532" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:26.506454" elapsed="0.016178">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.522808" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.526958" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.527191" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:26.527261" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:26.497426" elapsed="0.029942">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:26.527537" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:26.527583" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:26.496859" elapsed="0.030747"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:26.527807" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:26.527693" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:26.527672" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:26.529180" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:26.529866" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:26.529559" elapsed="0.000333"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:26.530725" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:26.530457" elapsed="0.000356">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:26.530876" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:26.530100" elapsed="0.000880">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.531161" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.531336" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.531539" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.531711" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.531878" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.532044" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.532208" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.532398" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.532563" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.532967" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.533143" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.533305" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:26.532691" elapsed="0.000667"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:26.532627" elapsed="0.000772"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.533542" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:26.533602" elapsed="0.000050"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:26.528635" elapsed="0.005111">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:26.533858" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:26.533902" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:26.528022" elapsed="0.005903"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:26.534580" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:26.534241" elapsed="0.000400">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:26.534007" elapsed="0.000699">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:26.533988" elapsed="0.000750">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:26.534783" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:26.496293" elapsed="0.038587">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.535054" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.535218" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:26.535279" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:26.493884" elapsed="0.041492">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.535560" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.535738" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.535944" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.536110" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.536278" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:26.536455" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:26.536519" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:26.491167" elapsed="0.045451">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:27.569422" 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-11T00:51:27.568941" elapsed="0.000516"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:27.570059" 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-11T00:51:27.569750" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:27.570137" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:51:27.570312" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:27.568542" elapsed="0.001796"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:27.575002" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:27.574810" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:27.575179" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:27.575751" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:27.575541" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:27.576229" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:27.575974" elapsed="0.000297"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:27.576433" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:27.576973" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:27.576768" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:27.577426" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:27.577163" elapsed="0.000314"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:27.578183" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:27.577645" elapsed="0.000564"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:27.578635" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:27.578377" elapsed="0.000303"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:27.579125" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:27.578832" elapsed="0.000318"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:27.585446" elapsed="0.000239"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:27.594092" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:27.594854" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:27.594477" elapsed="0.000403"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:27.596009" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:27.595477" elapsed="0.000686">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:27.596325" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:27.595063" elapsed="0.001397">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.596635" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.596808" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.596983" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.597150" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.597313" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.597492" elapsed="0.000069"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.597714" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.597884" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.598046" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.598314" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.598559" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.598753" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:27.598186" elapsed="0.000648"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:27.598115" elapsed="0.000751"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.599010" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:27.599070" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:27.593601" elapsed="0.005577">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:27.599247" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:27.583266" elapsed="0.016081">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.599549" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.603711" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.603907" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:27.603973" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:27.574252" elapsed="0.029827">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:27.604192" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:27.604235" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:27.573688" elapsed="0.030570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:27.604516" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:27.604344" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:27.604323" elapsed="0.000259"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:27.605893" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:27.606569" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:27.606251" elapsed="0.000343"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:27.607373" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:27.607109" elapsed="0.000404">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:27.607577" elapsed="0.000156"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:27.606774" elapsed="0.001049">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.607994" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.608165" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.608340" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.608535" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.608702" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.608866" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.609029" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.609198" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.609359" elapsed="0.000034"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.609652" elapsed="0.000026"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.609833" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.609992" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:27.609503" elapsed="0.000541"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:27.609439" elapsed="0.000631"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.610207" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:27.610265" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:27.605313" elapsed="0.005056">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:27.610497" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:27.610541" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:27.604733" elapsed="0.005831"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:27.611202" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:27.610871" elapsed="0.000392">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:27.610644" elapsed="0.000683">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:27.610626" elapsed="0.000732">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:27.611425" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:27.573065" elapsed="0.038458">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.611703" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.611907" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:27.611971" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:27.570658" elapsed="0.041412">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.612237" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.612429" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.612600" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.612761" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.612926" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:27.613089" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:27.613151" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:27.567738" elapsed="0.045511">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:28.647918" 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-11T00:51:28.647418" elapsed="0.000537"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:28.648460" 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-11T00:51:28.648140" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:28.648537" elapsed="0.000045"/>
</return>
<msg time="2026-04-11T00:51:28.648715" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:28.646993" elapsed="0.001746"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:28.653299" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:28.653110" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:28.653492" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:28.654048" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:28.653838" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:28.654724" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:28.654255" elapsed="0.000512"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:28.654917" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:28.655476" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:28.655252" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:28.655914" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:28.655669" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:28.656543" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:28.656107" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:28.656977" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:28.656738" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:28.657501" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:28.657198" elapsed="0.000329"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:28.663789" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:28.672352" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:28.673125" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:28.672730" elapsed="0.000422"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:28.674281" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:28.673750" elapsed="0.000704">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:28.674618" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:28.673335" elapsed="0.001400">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.674911" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.675084" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.675260" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.675445" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.675613" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.675776" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.675940" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.676107" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.676267" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.676550" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.676775" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.676966" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:28.676419" elapsed="0.000657"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:28.676334" elapsed="0.000772"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.677250" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:28.677310" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:28.671867" elapsed="0.005569">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:28.677506" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:28.661617" elapsed="0.015990">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.677819" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.682047" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.682241" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:28.682308" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:28.652560" elapsed="0.029911">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:28.682586" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:28.682629" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:28.651993" elapsed="0.030659"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:28.682852" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:28.682737" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:28.682717" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:28.684195" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:28.684876" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:28.684574" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:28.685703" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:28.685440" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:28.685851" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:28.685092" elapsed="0.000861">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.686123" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.686295" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.686492" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.686662" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.686825" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.686986" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.687147" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.687313" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.687488" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.687740" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.687910" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.688069" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:28.687614" elapsed="0.000543"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:28.687552" elapsed="0.000632"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.688325" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:28.688399" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:28.683660" elapsed="0.004845">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:28.688615" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:28.688658" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:28.683063" elapsed="0.005617"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:28.689312" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:28.688967" elapsed="0.000428">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:28.688759" elapsed="0.000701">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:28.688741" elapsed="0.000752">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:28.689538" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:28.651449" elapsed="0.038185">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.689809" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.689972" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:28.690033" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:28.649036" elapsed="0.041093">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.690295" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.690488" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.690657" elapsed="0.000107"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.690904" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.691069" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:28.691230" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:28.691291" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:28.646163" elapsed="0.045239">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:29.721578" 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-11T00:51:29.721098" elapsed="0.000514"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:29.722075" 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-11T00:51:29.721782" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:29.722150" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:51:29.722319" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:29.720715" elapsed="0.001628"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:29.726888" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:29.726698" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:29.727066" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:29.727633" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:29.727422" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:29.728096" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:29.727843" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:29.728282" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:29.728846" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:29.728639" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:29.729298" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:29.729054" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:29.729845" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:29.729504" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:29.730272" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:29.730036" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:29.730768" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:29.730481" elapsed="0.000313"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:29.739009" elapsed="0.000219"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:29.747656" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:29.748452" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:29.748035" elapsed="0.000445"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:29.749659" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:29.749105" elapsed="0.000704">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:29.749972" elapsed="0.000023"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:29.748710" elapsed="0.001386">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.750273" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.750459" elapsed="0.000024"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.750640" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.750805" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.751031" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.751194" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.751356" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.751539" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.751703" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.751973" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.752196" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.752401" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:29.751845" elapsed="0.000638"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:29.751773" elapsed="0.000741"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.752668" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:29.752728" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:29.747143" elapsed="0.005690">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:29.752900" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:29.736798" elapsed="0.016201">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.753171" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.757291" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.757535" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:29.757602" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:29.726149" elapsed="0.031557">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:29.757817" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:29.757860" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:29.725597" elapsed="0.032285"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:29.758098" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:29.757969" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:29.757948" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:29.759467" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:29.760174" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:29.759867" elapsed="0.000332"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:29.761032" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:29.760766" elapsed="0.000352">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:29.761180" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:29.760395" elapsed="0.000887">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.761475" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.761650" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.761823" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.761991" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.762156" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.762317" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.762494" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.762666" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.762827" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.763077" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.763246" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.763419" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:29.762952" elapsed="0.000520"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:29.762889" elapsed="0.000610"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.763637" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:29.763696" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:29.758916" elapsed="0.004883">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:29.763909" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:29.763952" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:29.758312" elapsed="0.005663"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:29.764793" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:29.764268" elapsed="0.000587">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:29.764056" elapsed="0.000862">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:29.764038" elapsed="0.000912">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:29.764995" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:29.725041" elapsed="0.040051">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.765304" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.765486" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:29.765550" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:29.722655" elapsed="0.042993">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.765815" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.765995" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.766162" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.766322" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.766501" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:29.766663" elapsed="0.000025"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:29.766730" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:29.719910" elapsed="0.046919">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:30.796874" 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-11T00:51:30.796393" elapsed="0.000516"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:30.797398" 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-11T00:51:30.797081" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:30.797476" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:51:30.797652" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:30.795977" elapsed="0.001701"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:30.802274" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:30.802083" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:30.802469" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:30.803026" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:30.802815" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:30.803509" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:30.803239" elapsed="0.000312"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:30.803697" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:30.804248" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:30.804039" elapsed="0.000242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:30.804849" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:30.804571" elapsed="0.000324"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:30.805446" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:30.805058" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:30.805892" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:30.805648" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:30.806378" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:30.806090" elapsed="0.000331"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:30.812918" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:30.823231" elapsed="0.000228"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:30.824005" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:30.823620" elapsed="0.000438"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:30.825205" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:30.824672" elapsed="0.000689">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:30.825545" elapsed="0.000023"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:30.824248" elapsed="0.001425">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.825848" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.826021" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.826195" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.826365" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.826549" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.826713" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.826876" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.827046" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.827207" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.827494" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.827721" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.827914" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:30.827348" elapsed="0.000649"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:30.827276" elapsed="0.000764"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.828185" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:30.828244" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:30.822739" elapsed="0.005612">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:30.828436" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:30.810693" elapsed="0.017890">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.828761" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.832931" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.833127" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:30.833194" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:30.801540" elapsed="0.031761">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:30.833475" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:30.833521" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:30.800967" elapsed="0.032577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:30.833764" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:30.833636" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:30.833614" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:30.835144" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:30.835833" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:30.835524" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:30.836688" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:30.836421" elapsed="0.000361">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:30.836845" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:30.836066" elapsed="0.000882">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.837120" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.837290" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.837489" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.837662" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.837827" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.837988" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.838152" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.838320" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.838500" elapsed="0.000059"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.838804" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.838977" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.839140" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:30.838673" elapsed="0.000521"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:30.838608" elapsed="0.000613"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.839360" elapsed="0.000034"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:30.839436" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:30.834602" elapsed="0.004939">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:30.839655" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:30.839699" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:30.833981" elapsed="0.005742"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:30.840564" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:30.840030" elapsed="0.000596">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:30.839804" elapsed="0.000886">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:30.839786" elapsed="0.000936">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:30.840768" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:30.800416" elapsed="0.040451">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.841044" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.841213" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:30.841276" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:30.797976" elapsed="0.043401">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.841569" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.841749" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.841919" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.842081" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.842248" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:30.842427" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:30.842490" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:30.795166" elapsed="0.047459">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:31.875020" 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-11T00:51:31.874547" elapsed="0.000508"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:31.875556" 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-11T00:51:31.875227" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:31.875633" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:51:31.875802" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:31.874140" elapsed="0.001687"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:31.880519" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:31.880304" elapsed="0.000242"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:31.880699" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:31.881254" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:31.881044" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:31.881745" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:31.881487" elapsed="0.000301"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:31.881936" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:31.882488" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:31.882267" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:31.882926" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:31.882681" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:31.883476" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:31.883118" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:31.883926" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:31.883689" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:31.884419" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:31.884120" elapsed="0.000326"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:31.891125" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:31.899946" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:31.900720" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:31.900311" elapsed="0.000436"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:31.901875" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:31.901323" elapsed="0.000717">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:31.902204" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:31.900933" elapsed="0.001391">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.902523" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.902769" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.902948" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.903117" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.903284" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.903464" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.903669" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.903842" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.904005" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.904277" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.904518" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.904712" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:31.904147" elapsed="0.000644"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:31.904074" elapsed="0.000755"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.904971" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:31.905031" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:31.899442" elapsed="0.005697">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:31.905208" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:31.888895" elapsed="0.016414">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.905500" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.909865" elapsed="0.000038"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.910082" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:31.910149" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:31.879704" elapsed="0.030563">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:31.910438" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:31.910490" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:31.879097" elapsed="0.031417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:31.910764" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:31.910643" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:31.910621" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:31.912168" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:31.912850" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:31.912546" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:31.913780" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:31.913448" elapsed="0.000424">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:31.913935" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:31.913087" elapsed="0.000963">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.914235" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.914439" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.914616" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.914783" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.914947" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.915107" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.915267" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.915450" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.915643" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.916060" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.916238" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.916414" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:31.915774" elapsed="0.000694"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:31.915709" elapsed="0.000787"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.916635" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:31.916693" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:31.911622" elapsed="0.005175">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:31.916908" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:31.916952" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:31.910982" elapsed="0.005993"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:31.917610" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:31.917275" elapsed="0.000395">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:31.917056" elapsed="0.000676">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:31.917037" elapsed="0.000763">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:31.917850" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:31.878542" elapsed="0.039407">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.918125" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.918290" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:31.918351" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:31.876123" elapsed="0.042344">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.918635" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.918813" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.918980" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.919141" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.919304" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:31.919482" elapsed="0.000033"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:31.919560" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:31.873334" elapsed="0.046329">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:32.950478" 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-11T00:51:32.949972" elapsed="0.000542"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:32.950987" 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-11T00:51:32.950688" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:32.951076" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:51:32.951249" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:32.949581" elapsed="0.001694"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:32.955866" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:32.955675" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:32.956044" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:32.956611" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:32.956400" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:32.957186" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:32.956926" elapsed="0.000303"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:32.957377" elapsed="0.000200"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:32.957942" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:32.957731" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:32.958398" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:32.958136" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:32.959161" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:32.958597" elapsed="0.000591"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:32.959617" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:32.959357" elapsed="0.000304"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:32.960097" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:32.959811" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:32.966404" elapsed="0.000214"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:32.974956" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:32.975731" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:32.975335" elapsed="0.000423"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:32.976886" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:32.976336" elapsed="0.000703">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:32.977200" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:32.975945" elapsed="0.001374">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.977512" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.977685" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.977858" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.978025" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.978187" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.978350" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.978531" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.978700" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.978862" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.979140" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.979364" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.979573" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:32.979010" elapsed="0.000645"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:32.978930" elapsed="0.000754"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.979825" elapsed="0.000056"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:32.979924" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:32.974471" elapsed="0.005563">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:32.980104" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:32.964213" elapsed="0.015994">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.980399" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.984555" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.984750" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:32.984817" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:32.955119" elapsed="0.029804">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:32.985033" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:32.985076" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:32.954559" elapsed="0.030540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:32.985300" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:32.985185" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:32.985164" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:32.986705" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:32.987393" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:32.987078" elapsed="0.000344"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:32.988203" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:32.987941" elapsed="0.000347">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:32.988350" elapsed="0.000172"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:32.987602" elapsed="0.001012">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.988788" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.988961" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.989135" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.989303" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.989531" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.989702" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.989866" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.990035" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.990196" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.990464" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.990636" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.990797" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:32.990322" elapsed="0.000528"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:32.990259" elapsed="0.000617"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.991030" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:32.991090" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:32.986151" elapsed="0.005042">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:32.991305" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:32.991348" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:32.985567" elapsed="0.005804"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:32.991995" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:32.991682" elapsed="0.000373">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:32.991468" elapsed="0.000650">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:32.991449" elapsed="0.000702">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:32.992196" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:32.953991" elapsed="0.038301">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.992483" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.992650" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:32.992712" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:32.951591" elapsed="0.041220">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.992983" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.993162" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.993329" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.993544" elapsed="0.000022"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.993713" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:32.993877" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:32.993937" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:32.948745" elapsed="0.045291">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:34.025458" 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-11T00:51:34.024977" elapsed="0.000516"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:34.025981" 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-11T00:51:34.025664" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:34.026078" elapsed="0.000049"/>
</return>
<msg time="2026-04-11T00:51:34.026288" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:34.024439" elapsed="0.001882"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:34.030968" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:34.030778" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:34.031145" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:34.031708" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:34.031501" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:34.032373" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:34.031925" elapsed="0.000507"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:34.032582" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:34.033126" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:34.032920" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:34.033585" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:34.033317" elapsed="0.000313"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:34.034120" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:34.033782" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:34.034601" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:34.034310" elapsed="0.000340"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:34.035081" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:34.034800" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:34.041325" elapsed="0.000225"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:34.050142" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:34.050961" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:34.050574" elapsed="0.000412"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:34.052186" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:34.051658" elapsed="0.000683">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:34.052523" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:34.051237" elapsed="0.001411">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.052823" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.052995" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.053167" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.053334" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.053515" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.053684" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.053856" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.054022" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.054181" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.054468" elapsed="0.000038"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.054715" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.054906" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:34.054325" elapsed="0.000665"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:34.054247" elapsed="0.000773"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.055160" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:34.055220" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:34.049625" elapsed="0.005699">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:34.055406" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:34.039169" elapsed="0.016337">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.055684" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.059998" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.060198" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:34.060300" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:34.030198" elapsed="0.030261">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:34.060576" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:34.060619" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:34.029638" elapsed="0.031004"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:34.060845" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:34.060728" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:34.060707" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:34.062190" elapsed="0.000222"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:34.062880" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:34.062577" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:34.063695" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:34.063432" elapsed="0.000349">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:34.063843" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:34.063084" elapsed="0.000862">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.064116" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.064285" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.064483" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.064653" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.064819" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.064981" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.065143" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.065309" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.065485" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.065739" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.065908" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.066067" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:34.065614" elapsed="0.000505"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:34.065550" elapsed="0.000594"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.066281" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:34.066339" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:34.061656" elapsed="0.004805">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:34.066600" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:34.066681" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:34.061058" elapsed="0.005648"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:34.067314" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:34.067001" elapsed="0.000373">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:34.066789" elapsed="0.000666">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:34.066770" elapsed="0.000717">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:34.067532" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:34.029078" elapsed="0.038550">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.067802" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.067966" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:34.068028" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:34.026697" elapsed="0.041429">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.068290" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.068481" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.068651" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.068811" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.068975" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:34.069137" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:34.069197" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:34.023641" elapsed="0.045653">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:35.099195" 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-11T00:51:35.098730" elapsed="0.000498"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:35.099711" 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-11T00:51:35.099413" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:35.099786" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:51:35.099953" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:35.098330" elapsed="0.001648"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:35.104603" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:35.104413" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:35.104783" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:35.105334" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:35.105125" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:35.105815" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:35.105559" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:35.106018" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:35.106575" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:35.106353" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:35.107011" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:35.106768" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:35.107558" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:35.107201" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:35.107985" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:35.107749" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:35.108472" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:35.108175" elapsed="0.000323"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:35.114877" elapsed="0.000208"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:35.123364" elapsed="0.000222"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:35.124115" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:35.123739" elapsed="0.000402"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:35.125262" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:35.124737" elapsed="0.000696">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:35.125593" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:35.124323" elapsed="0.001388">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.125883" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.126089" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.126264" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.126448" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.126614" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.126775" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.126936" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.127101" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.127259" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.127543" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.127807" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.127996" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:35.127413" elapsed="0.000664"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:35.127329" elapsed="0.000779"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.128248" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:35.128306" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:35.122882" elapsed="0.005543">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:35.128495" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:35.112678" elapsed="0.015915">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.128765" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.132878" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.133069" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:35.133134" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:35.103852" elapsed="0.029388">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:35.133350" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:35.133453" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:35.103285" elapsed="0.030194"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:35.133687" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:35.133566" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:35.133545" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:35.135048" elapsed="0.000203"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:35.135719" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:35.135418" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:35.136529" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:35.136253" elapsed="0.000362">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:35.136676" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:35.135923" elapsed="0.000854">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.136946" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.137152" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.137327" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.137521" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.138514" elapsed="0.000090"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.138805" elapsed="0.000024"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.138975" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.139143" elapsed="0.001900"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.141202" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.141495" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.141671" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.141834" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:35.141351" elapsed="0.000536"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:35.141273" elapsed="0.000645"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.142070" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:35.142131" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:35.134513" elapsed="0.007733">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:35.142360" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:35.142420" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:35.133902" elapsed="0.008542"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:35.143084" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:35.142747" elapsed="0.000403">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:35.142526" elapsed="0.000687">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:35.142508" elapsed="0.000737">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:35.143292" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:35.102737" elapsed="0.040668">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.143583" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.143755" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:35.143818" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:35.100336" elapsed="0.043578">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.144159" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.144337" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.144521" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.144682" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.144845" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:35.145006" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:35.145066" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:35.097532" elapsed="0.047631">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:36.175732" 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-11T00:51:36.175242" elapsed="0.000525"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:36.176237" 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-11T00:51:36.175941" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:36.176313" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:51:36.176499" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:36.174827" elapsed="0.001698"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:36.181098" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:36.180905" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:36.181275" elapsed="0.000246"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:36.181919" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:36.181705" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:36.182423" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:36.182150" elapsed="0.000316"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:36.182614" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:36.183212" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:36.183008" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:36.183674" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:36.183418" elapsed="0.000298"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:36.184207" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:36.183868" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:36.184847" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:36.184414" elapsed="0.000477"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:36.185332" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:36.185042" elapsed="0.000316"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:36.191822" elapsed="0.000293"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:36.200535" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:36.201294" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:36.200900" elapsed="0.000420"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:36.202515" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:36.201965" elapsed="0.000702">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:36.202830" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:36.201566" elapsed="0.001385">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.203127" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.203302" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.203495" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.203667" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.203834" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.203998" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.204161" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.204365" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.204559" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.204830" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.205057" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.205247" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:36.204700" elapsed="0.000626"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:36.204629" elapsed="0.000727"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.205545" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:36.205608" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:36.200030" elapsed="0.005687">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:36.205787" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:36.189617" elapsed="0.016270">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.206060" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.210224" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.210519" elapsed="0.000024"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:36.210589" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:36.180348" elapsed="0.030347">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:36.210813" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:36.210856" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:36.179790" elapsed="0.031088"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:36.211089" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:36.210968" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:36.210946" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:36.212457" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:36.213121" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:36.212818" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:36.213966" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:36.213702" elapsed="0.000351">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:36.214115" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:36.213326" elapsed="0.000891">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.214410" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.214584" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.214758" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.214925" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.215089" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.215250" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.215427" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.215597" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.215758" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.216168" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.216344" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.216525" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:36.215883" elapsed="0.000696"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:36.215820" elapsed="0.000786"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.216752" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:36.216818" elapsed="0.000056"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:36.211907" elapsed="0.005063">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:36.217083" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:36.217127" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:36.211304" elapsed="0.005846"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:36.217804" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:36.217481" elapsed="0.000384">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:36.217231" elapsed="0.000697">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:36.217213" elapsed="0.000748">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:36.218007" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:36.179225" elapsed="0.038880">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.218284" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.218464" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:36.218527" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:36.176823" elapsed="0.041804">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.218804" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.218983" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.219154" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.219315" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.219498" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:36.219662" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:36.219724" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:36.174022" elapsed="0.045803">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:37.251402" 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-11T00:51:37.250907" elapsed="0.000531"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:37.252015" 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-11T00:51:37.251710" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:37.252093" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:51:37.252263" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:37.250517" elapsed="0.001772"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:37.256891" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:37.256698" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:37.257082" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:37.257656" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:37.257444" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:37.258118" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:37.257863" elapsed="0.000297"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:37.258305" elapsed="0.000197"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:37.258856" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:37.258651" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:37.259288" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:37.259047" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:37.259830" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:37.259493" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:37.260251" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:37.260018" elapsed="0.000277"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:37.260945" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:37.260458" elapsed="0.000537"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:37.267343" elapsed="0.000227"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:37.275981" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:37.276748" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:37.276348" elapsed="0.000427"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:37.277932" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:37.277372" elapsed="0.000711">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:37.278246" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:37.276978" elapsed="0.001387">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.278556" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.278730" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.278903" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.279070" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.279235" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.279411" elapsed="0.000058"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.279623" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.279794" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.279957" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.280227" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.280470" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.280664" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:37.280098" elapsed="0.000648"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:37.280027" elapsed="0.000749"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.280918" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:37.280993" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:37.275493" elapsed="0.005608">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:37.281170" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:37.265162" elapsed="0.016108">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.281460" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.285590" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.285782" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:37.285847" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:37.256142" elapsed="0.029811">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:37.286065" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:37.286108" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:37.255588" elapsed="0.030543"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:37.286334" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:37.286218" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:37.286197" elapsed="0.000256"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:37.287749" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:37.288431" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:37.288108" elapsed="0.000351"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:37.289254" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:37.288990" elapsed="0.000388">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:37.289458" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:37.288641" elapsed="0.000922">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.289737" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.289911" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.290085" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.290254" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.290463" elapsed="0.000024"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.290641" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.290810" elapsed="0.000026"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.290988" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.291151" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.291574" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.291746" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.291908" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:37.291442" elapsed="0.000519"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:37.291213" elapsed="0.000774"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.292126" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:37.292186" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:37.287194" elapsed="0.005098">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:37.292419" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:37.292464" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:37.286607" elapsed="0.005881"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:37.293114" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:37.292781" elapsed="0.000394">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:37.292569" elapsed="0.000669">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:37.292550" elapsed="0.000720">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:37.293315" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:37.255021" elapsed="0.038408">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.293606" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.293812" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:37.293876" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:37.252604" elapsed="0.041372">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.294144" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.294320" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.294507" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.294670" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.294836" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:37.294999" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:37.295060" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:37.249714" elapsed="0.045443">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:38.325571" 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-11T00:51:38.325056" elapsed="0.000552"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:38.326088" 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-11T00:51:38.325786" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:38.326165" elapsed="0.000047"/>
</return>
<msg time="2026-04-11T00:51:38.326347" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:38.324656" elapsed="0.001716"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:38.331040" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:38.330848" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:38.331218" elapsed="0.000222"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:38.331840" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:38.331602" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:38.332369" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:38.332102" elapsed="0.000328"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:38.332612" elapsed="0.000186"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:38.333155" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:38.332949" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:38.333605" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:38.333345" elapsed="0.000302"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:38.334479" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:38.333799" elapsed="0.000707"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:38.334943" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:38.334693" elapsed="0.000296"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:38.335507" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:38.335165" elapsed="0.000377"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:38.342080" elapsed="0.000218"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:38.350793" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:38.351569" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:38.351159" elapsed="0.000436"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:38.352758" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:38.352171" elapsed="0.000742">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:38.353072" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:38.351782" elapsed="0.001412">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.353367" elapsed="0.000038"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.353558" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.353732" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.353899" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.354061" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.354222" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.354397" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.354567" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.354727" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.355000" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.355222" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.355428" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:38.354872" elapsed="0.000639"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:38.354800" elapsed="0.000741"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.355684" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:38.355743" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:38.350289" elapsed="0.005561">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:38.355918" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:38.339843" elapsed="0.016173">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.356230" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.360457" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.360656" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:38.360723" elapsed="0.000028"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:38.330288" elapsed="0.030563">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:38.360962" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:38.361005" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:38.329710" elapsed="0.031318"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:38.361233" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:38.361116" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:38.361095" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:38.362641" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:38.363302" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:38.363003" elapsed="0.000324"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:38.364147" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:38.363861" elapsed="0.000375">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:38.364299" elapsed="0.000215"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:38.363521" elapsed="0.001090">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.364789" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.364962" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.365139" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.365313" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.365497" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.365667" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.365834" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.366004" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.366166" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.366435" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.366609" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.366776" elapsed="0.000025"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:38.366293" elapsed="0.000593"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:38.366229" elapsed="0.000692"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.367069" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:38.367129" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:38.362087" elapsed="0.005176">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:38.367400" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:38.367447" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:38.361500" elapsed="0.005971"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:38.368090" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:38.367768" elapsed="0.000383">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:38.367553" elapsed="0.000663">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:38.367534" elapsed="0.000715">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:38.368295" elapsed="0.000020"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:38.329128" elapsed="0.039323">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.368634" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.368804" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:38.368868" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:38.326690" elapsed="0.042280">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.369143" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.369324" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.369537" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.369707" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.369877" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:38.370042" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:38.370105" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:38.323792" elapsed="0.046415">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:39.400780" 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-11T00:51:39.400299" elapsed="0.000516"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:39.401282" 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-11T00:51:39.400986" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:39.401356" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:51:39.401544" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:39.399896" elapsed="0.001673"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:39.406109" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:39.405922" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:39.406286" elapsed="0.000211"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:39.406859" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:39.406651" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:39.407559" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:39.407105" elapsed="0.000498"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:39.407752" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:39.408305" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:39.408099" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:39.408763" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:39.408518" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:39.409295" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:39.408955" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:39.409740" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:39.409503" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:39.410215" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:39.409933" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:39.416534" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:39.425048" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:39.425815" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:39.425421" elapsed="0.000421"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:39.426968" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:39.426439" elapsed="0.000680">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:39.427280" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:39.426026" elapsed="0.001387">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.427593" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.427766" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.427978" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.428151" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.428393" elapsed="0.000024"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.428562" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.428725" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.428894" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.429054" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.429320" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.429562" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.429754" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:39.429191" elapsed="0.000644"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:39.429121" elapsed="0.000743"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.430007" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:39.430066" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:39.424563" elapsed="0.005610">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:39.430240" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:39.414332" elapsed="0.016006">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.430527" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.434880" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.435078" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:39.435144" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:39.405370" elapsed="0.029879">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:39.435360" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:39.435420" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:39.404825" elapsed="0.030619"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:39.435649" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:39.435531" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:39.435510" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:39.437035" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:39.437759" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:39.437451" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:39.438589" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:39.438302" elapsed="0.000374">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:39.438738" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:39.437965" elapsed="0.000875">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.439011" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.439181" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.439355" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.439541" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.439706" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.439868" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.440055" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.440224" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.440399" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.440652" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.440822" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.440981" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:39.440527" elapsed="0.000506"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:39.440464" elapsed="0.000595"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.441196" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:39.441254" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:39.436494" elapsed="0.004864">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:39.441484" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:39.441527" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:39.435877" elapsed="0.005673"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:39.442155" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:39.441842" elapsed="0.000373">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:39.441631" elapsed="0.000645">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:39.441612" elapsed="0.000696">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:39.442352" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:39.404266" elapsed="0.038200">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.442676" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.442848" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:39.442909" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:39.401869" elapsed="0.041138">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.443174" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.443350" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.443536" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.443696" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.443860" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:39.444034" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:39.444096" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:39.399100" elapsed="0.045094">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:40.475597" 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-11T00:51:40.475108" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:40.476094" 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-11T00:51:40.475800" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:40.476169" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:51:40.476338" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:40.474718" elapsed="0.001644"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:40.480918" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:40.480731" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:40.481096" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:40.481659" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:40.481450" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:40.482128" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:40.481875" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:40.482312" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:40.482861" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:40.482658" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:40.483422" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:40.483160" elapsed="0.000319"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:40.483972" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:40.483632" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:40.484414" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:40.484164" elapsed="0.000295"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:40.484887" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:40.484607" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:40.491279" elapsed="0.000254"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:40.499858" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:40.500629" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:40.500224" elapsed="0.000431"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:40.501789" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:40.501236" elapsed="0.000705">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:40.502100" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:40.500841" elapsed="0.001379">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.502428" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.502605" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.502777" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.502944" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.503108" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.503271" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.503458" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.503628" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.503786" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.504075" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.504297" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.504543" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:40.503946" elapsed="0.000683"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:40.503873" elapsed="0.000785"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.504798" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:40.504857" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:40.499329" elapsed="0.005633">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:40.505031" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:40.489111" elapsed="0.016055">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.505339" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.509480" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.509670" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:40.509735" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:40.480181" elapsed="0.029659">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:40.509954" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:40.509997" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:40.479630" elapsed="0.030390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:40.510220" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:40.510106" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:40.510086" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:40.511628" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:40.512285" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:40.511985" elapsed="0.000325"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:40.513104" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:40.512841" elapsed="0.000349">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:40.513252" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:40.512506" elapsed="0.000849">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.513547" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.513717" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.513889" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.514056" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.514217" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.514377" elapsed="0.000035"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.514558" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.514726" elapsed="0.000155"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.515028" elapsed="0.000054"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.515320" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.515519" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.515680" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:40.515192" elapsed="0.000542"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:40.515128" elapsed="0.000632"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.515898" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:40.515956" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:40.511039" elapsed="0.005021">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:40.516171" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:40.516214" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:40.510458" elapsed="0.005779"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:40.516868" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:40.516544" elapsed="0.000385">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:40.516317" elapsed="0.000675">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:40.516298" elapsed="0.000726">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:40.517070" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:40.479047" elapsed="0.038121">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.517341" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.517524" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:40.517587" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:40.476675" elapsed="0.041010">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.517852" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.518027" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.518195" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.518355" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.518544" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:40.518709" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:40.518769" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:40.473930" elapsed="0.044971">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:41.551668" 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-11T00:51:41.551168" elapsed="0.000534"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:41.552180" 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-11T00:51:41.551877" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:41.552258" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:51:41.552451" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:41.550747" elapsed="0.001733"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:41.557117" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:41.556920" elapsed="0.000223"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:41.557294" elapsed="0.000211"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:41.557867" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:41.557659" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:41.558336" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:41.558079" elapsed="0.000299"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:41.558542" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:41.561198" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:41.558874" elapsed="0.002354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:41.561675" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:41.561418" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:41.562221" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:41.561872" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:41.562707" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:41.562451" elapsed="0.000301"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:41.563219" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:41.562907" elapsed="0.000339"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:41.569664" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:41.578219" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:41.579035" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:41.578598" elapsed="0.000473"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:41.580268" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:41.579735" elapsed="0.000708">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:41.580614" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:41.579295" elapsed="0.001438">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.580910" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.581144" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.581322" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.581513" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.581684" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.581851" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.582017" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.582191" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.582356" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.582652" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.582898" elapsed="0.000046"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.583125" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:41.582519" elapsed="0.000692"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:41.582447" elapsed="0.000793"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.583400" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:41.583464" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:41.577734" elapsed="0.005839">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:41.583642" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:41.567447" elapsed="0.016295">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.583925" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.588146" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.588349" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:41.588434" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:41.556334" elapsed="0.032210">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:41.588659" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:41.588703" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:41.555773" elapsed="0.032953"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:41.588994" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:41.588864" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:41.588836" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:41.590440" elapsed="0.000239"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:41.591179" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:41.590837" elapsed="0.000369"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:41.592055" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:41.591783" elapsed="0.000362">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:41.592207" elapsed="0.000162"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:41.591406" elapsed="0.001071">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.592656" elapsed="0.000027"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.592838" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.593013" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.593179" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.593344" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.593523" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.593686" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.593854" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.594020" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.594273" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.594456" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.594617" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:41.594147" elapsed="0.000522"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:41.594084" elapsed="0.000611"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.594833" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:41.594892" elapsed="0.000024"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:41.589853" elapsed="0.005152">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:41.595117" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:41.595160" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:41.589215" elapsed="0.005967"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:41.595808" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:41.595490" elapsed="0.000378">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:41.595263" elapsed="0.000667">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:41.595245" elapsed="0.000751">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:41.596045" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:41.555205" elapsed="0.040939">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.596339" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.596528" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:41.596591" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:41.552779" elapsed="0.043910">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.596855" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.597035" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.597201" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.597362" elapsed="0.000034"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.597546" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:41.597708" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:41.597769" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:41.549942" elapsed="0.047925">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.627907" 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-11T00:51:42.627428" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.628454" 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-11T00:51:42.628117" elapsed="0.000365"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:42.628532" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:51:42.628704" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:51:42.627021" elapsed="0.001708"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:51:42.633593" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:51:42.633360" elapsed="0.000262"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:42.633778" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:42.634343" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:42.634131" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.634938" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:42.634675" elapsed="0.000306"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:51:42.635130" elapsed="0.000184"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:42.635696" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:51:42.635486" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.636349" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:42.635892" elapsed="0.000516"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.636914" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:42.636567" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.637348" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:42.637110" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.637848" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:51:42.637562" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:42.644478" elapsed="0.000218"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:42.653261" elapsed="0.000234"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.654048" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:42.653653" elapsed="0.000422"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:42.655292" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.654725" elapsed="0.000745">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.655636" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.654264" elapsed="0.001494">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.655933" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.656106" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.656278" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.656475" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.656646" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.656844" elapsed="0.000028"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.657031" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.657200" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.657362" elapsed="0.000036"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.657651" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.657894" elapsed="0.000025"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.658100" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:42.657522" elapsed="0.000660"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.657449" elapsed="0.000763"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.658354" elapsed="0.000092"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.658493" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.652736" elapsed="0.005868">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.658673" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.642011" elapsed="0.016764">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.658963" elapsed="0.000024"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.663529" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.663755" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.663830" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.632767" elapsed="0.031198">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:42.664082" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:42.664126" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:42.632180" elapsed="0.031969"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.664370" elapsed="0.000075"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:42.664242" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:42.664219" elapsed="0.000281"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:51:42.665819" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.666556" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:51:42.666203" elapsed="0.000380"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:51:42.667401" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.667118" elapsed="0.000373">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.667555" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.666767" elapsed="0.000894">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.667832" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.668023" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.668201" elapsed="0.000204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.668569" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.668778" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.668950" elapsed="0.000024"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.669128" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.669300" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.669482" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.669741" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.669911" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.670081" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:51:42.669615" elapsed="0.000521"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.669549" elapsed="0.000613"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.670301" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.670360" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.665259" elapsed="0.005257">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:51:42.670630" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:51:42.670674" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:42.664653" elapsed="0.006044"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.671333" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.671004" elapsed="0.000410">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:42.670779" elapsed="0.000700">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:42.670760" elapsed="0.000753">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.671558" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.631536" elapsed="0.040122">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.671834" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.672041" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.672115" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:51:42.629035" elapsed="0.043185">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.672407" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.672588" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.672755" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.672981" elapsed="0.000023"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.673180" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.673393" elapsed="0.000025"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.673463" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.626187" elapsed="0.047381">Could not parse owner and candidates for device openflow:1</status>
</kw>
<msg time="2026-04-11T00:51:42.673672" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.475890" elapsed="30.197875">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.673841" elapsed="0.000016"/>
</return>
<var>${new_owner}</var>
<var>${new_successors_list}</var>
<arg>openflow:1</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.473852" elapsed="30.200090">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.674152" elapsed="0.000026"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor.</doc>
<status status="FAIL" start="2026-04-11T00:51:12.465774" elapsed="30.208556">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</test>
<test id="s1-s2-t37" name="Check Network Operational Information After Start" line="191">
<kw name="Check OpenFlow Network Operational Information For Sample Topology" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.681442" level="INFO">${dictionary} = {'openflow:1': '4', 'openflow:2': '5', 'openflow:3': '5'}</msg>
<var>${dictionary}</var>
<arg>openflow:1=4</arg>
<arg>openflow:2=5</arg>
<arg>openflow:3=5</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:51:42.681071" elapsed="0.000401"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.687760" 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-11T00:51:42.687302" elapsed="0.000487"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.688283" 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-11T00:51:42.687950" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:42.688358" elapsed="0.000049"/>
</return>
<msg time="2026-04-11T00:51:42.688555" 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-11T00:51:42.686916" elapsed="0.001676"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.692981" elapsed="0.000029"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.693242" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:42.688779" elapsed="0.004524"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.688654" elapsed="0.004678"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'openflow:1': '4', 'openflow:2': '5', 'openflow:3': '5'}.</doc>
<status status="PASS" start="2026-04-11T00:51:42.686307" elapsed="0.007097"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:51:42.681663" elapsed="0.011799"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.694042" level="INFO">${dictionary} = {'openflow:1': '21', 'openflow:2': '19', 'openflow:3': '19'}</msg>
<var>${dictionary}</var>
<arg>openflow:1=21</arg>
<arg>openflow:2=19</arg>
<arg>openflow:3=19</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:51:42.693702" elapsed="0.000369"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.700095" 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-11T00:51:42.699712" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.700588" 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-11T00:51:42.700281" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:42.700660" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:51:42.700818" 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-11T00:51:42.699325" elapsed="0.001526"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.705007" elapsed="0.000028"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.705254" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:42.701031" elapsed="0.004282"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.700911" elapsed="0.004429"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'openflow:1': '21', 'openflow:2': '19', 'openflow:3': '19'}.</doc>
<status status="PASS" start="2026-04-11T00:51:42.698770" elapsed="0.006640"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:51:42.694261" elapsed="0.011204"/>
</kw>
<doc>Check devices in tree,2 are in operational inventory and topology in all instances in ${controller_index_list}.
Inventory should show 1x node_id per device 1x node_id per connector. Topology should show 2x node_id per device + 3x node_id per connector
+ 5x node_id per link termination. TODO: A Keyword that can calculate this based on mininet topology.</doc>
<status status="PASS" start="2026-04-11T00:51:42.679038" elapsed="0.026492"/>
</kw>
<doc>Check devices in operational inventory and topology in all cluster instances.</doc>
<status status="PASS" start="2026-04-11T00:51:42.674625" elapsed="0.031008"/>
</test>
<test id="s1-s2-t38" name="Add Configuration In Owner and Verify After Start" line="195">
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:51:42.717529" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.713985" elapsed="0.003584">Variable '${new_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.705816" elapsed="0.011887">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-t39" name="Modify Configuration In Owner and Verify After Start" line="199">
<kw name="Modify Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:51:42.729723" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.726146" elapsed="0.003617">Variable '${new_owner}' not found.</status>
</kw>
<doc>Modify Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.717888" elapsed="0.012006">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-t40" name="Delete Configuration In Owner and Verify After Start" line="203">
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:51:42.734648" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.730657" elapsed="0.004032">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.730074" elapsed="0.004745">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-t41" name="Add Configuration In Old Owner and Verify After Start" line="207">
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:51:42.746963" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.743083" elapsed="0.003921">Variable '${original_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.734998" elapsed="0.012134">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-t42" name="Modify Configuration In Old Owner and Verify After Start" line="211">
<kw name="Modify Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:51:42.759214" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.755451" elapsed="0.003801">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.747308" elapsed="0.012087">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-t43" name="Delete Configuration In Old Owner and Verify After Start" line="215">
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:51:42.764034" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.760184" elapsed="0.003888">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.759575" elapsed="0.004626">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-t44" name="Send RPC Add to Owner and Verify After Start" line="219">
<kw name="Send RPC Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:51:42.776055" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.772507" elapsed="0.003586">Variable '${new_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.764380" elapsed="0.011842">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-t45" name="Send RPC Delete to Owner and Verify After Start" line="223">
<kw name="Send RPC Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:51:42.788206" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.784690" elapsed="0.003554">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.776416" elapsed="0.011957">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-t46" name="Send RPC Add to Old Owner and Verify After Start" line="227">
<kw name="Send RPC Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:51:42.800459" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.796706" elapsed="0.003790">Variable '${original_owner}' not found.</status>
</kw>
<doc>Add Flow in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.788564" elapsed="0.012059">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-t47" name="Send RPC Delete to Old Owner and Verify After Start" line="231">
<kw name="Send RPC Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:51:42.812607" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.808871" elapsed="0.003774">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete Flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.800799" elapsed="0.011974">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-t48" name="Modify Network and Verify After Start" line="235">
<kw name="Take OpenFlow Device Link Down and Verify" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.819649" level="INFO">${dictionary} = {'"link-down":true': '1'}</msg>
<var>${dictionary}</var>
<arg>"link-down":true=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:51:42.819257" elapsed="0.000420"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<msg time="2026-04-11T00:51:42.830293" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<var>${ouput}</var>
<arg>${mininet_conn_id}</arg>
<arg>link s1 s2 down</arg>
<doc>Sends Command ${cmd} to Mininet session ${mininet_conn} and returns read buffer response.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.826548" elapsed="0.003804">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${operational_port_1}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.830576" elapsed="0.000022"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>${dictionary}</var>
<arg>openflow:1=16</arg>
<arg>openflow:2=14</arg>
<arg>openflow:3=19</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.830781" elapsed="0.000020"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>20s</arg>
<arg>2s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.830976" elapsed="0.000020"/>
</kw>
<doc>Take a link down and verify port status in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.817205" elapsed="0.013895">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Take a link down and verify port status in all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.812949" elapsed="0.018275">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s2-t49" name="Restore Network and Verify After Start" line="239">
<kw name="Take OpenFlow Device Link Up and Verify" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.838189" level="INFO">${dictionary} = {'"link-down":true': '0'}</msg>
<var>${dictionary}</var>
<arg>"link-down":true=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:51:42.837884" elapsed="0.000333"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<msg time="2026-04-11T00:51:42.848849" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<var>${ouput}</var>
<arg>${mininet_conn_id}</arg>
<arg>link s1 s2 up</arg>
<doc>Sends Command ${cmd} to Mininet session ${mininet_conn} and returns read buffer response.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.845081" elapsed="0.003806">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${operational_port_1}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.849083" elapsed="0.000022"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>${dictionary}</var>
<arg>openflow:1=21</arg>
<arg>openflow:2=19</arg>
<arg>openflow:3=19</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.849288" elapsed="0.000020"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.849498" elapsed="0.000021"/>
</kw>
<doc>Take the link up and verify port status in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.835918" elapsed="0.013754">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Take the link up and verify port status in all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.831420" elapsed="0.018374">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s2-t50" name="Stop Mininet and Exit" line="243">
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<msg time="2026-04-11T00:51:42.857924" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="FAIL" start="2026-04-11T00:51:42.854209" elapsed="0.003752">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<status status="NOT RUN" start="2026-04-11T00:51:42.858169" elapsed="0.000024"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="FAIL" start="2026-04-11T00:51:42.849972" elapsed="0.008357">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s2-t51" name="Check No Network Operational Information" line="248">
<kw name="Check No OpenFlow Network Operational Information" owner="ClusterOpenFlow">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.865076" level="INFO">${dictionary} = {'openflow': '0'}</msg>
<var>${dictionary}</var>
<arg>openflow=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:51:42.864771" elapsed="0.000332"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_No_Content_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.870990" 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-11T00:51:42.870597" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.871489" 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-11T00:51:42.871178" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:42.871564" elapsed="0.000037"/>
</return>
<msg time="2026-04-11T00:51:42.871730" 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-11T00:51:42.870190" elapsed="0.001564"/>
</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-11T00:51:42.872102" elapsed="0.000023"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for /rests/data/opendaylight-inventory:nodes?content=nonconfig in ${session} using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.876027" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:42.871939" elapsed="0.004153"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.871813" elapsed="0.004308"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check there is no content.</doc>
<status status="PASS" start="2026-04-11T00:51:42.869686" elapsed="0.006493"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_No_Content_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:51:42.865285" elapsed="0.010944"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.876727" level="INFO">${dictionary} = {'openflow': '0'}</msg>
<var>${dictionary}</var>
<arg>openflow=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:51:42.876427" elapsed="0.000327"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.882669" 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-11T00:51:42.882262" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.883137" 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-11T00:51:42.882853" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:42.883208" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:51:42.883360" 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-11T00:51:42.881896" elapsed="0.001502"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.887535" elapsed="0.000028"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:42.887787" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:42.883569" elapsed="0.004278"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.883452" elapsed="0.004421"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'openflow': '0'}.</doc>
<status status="PASS" start="2026-04-11T00:51:42.881334" elapsed="0.006593"/>
</kw>
<arg>20s</arg>
<arg>2s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:51:42.876935" elapsed="0.011098"/>
</kw>
<doc>Check device is not in operational inventory or topology in all cluster instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-11T00:51:42.862818" elapsed="0.025279"/>
</kw>
<doc>Check device is not in operational inventory or topology in all cluster instances.</doc>
<status status="PASS" start="2026-04-11T00:51:42.858521" elapsed="0.029672"/>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-11T00:51:42.888873" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-11T00:51:42.888777" elapsed="0.000150"/>
</kw>
<doc>Test suite for Cluster HA - Device Owner Stop and Start</doc>
<status status="FAIL" start="2026-04-11T00:49:11.180523" elapsed="151.708492"/>
</suite>
<suite id="s1-s3" name="Cluster HA Data Recovery Leader Follower Failover" source="/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustering/030__Cluster_HA_Data_Recovery_Leader_Follower_Failover.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-11T00:51:42.972050" 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-11T00:51:42.968042" elapsed="0.004066"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-11T00:51:42.967809" elapsed="0.004372"/>
</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-11T00:51:42.976759" 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-11T00:51:42.973277" elapsed="0.003511"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-11T00:51:42.977004" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:42.976877" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:42.976852" elapsed="0.000221"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.977582" 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-11T00:51:42.977227" elapsed="0.000399"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.978101" 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-11T00:51:42.977789" elapsed="0.000339"/>
</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-11T00:51:42.978672" elapsed="0.000287"/>
</kw>
<msg time="2026-04-11T00:51:42.979059" level="INFO">${status} = PASS</msg>
<msg time="2026-04-11T00:51:42.979106" 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-11T00:51:42.978309" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.979681" 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-11T00:51:42.979295" elapsed="0.000413"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.980678" 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-11T00:51:42.980414" elapsed="0.000291"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.981108" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:42.980854" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.981598" 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-11T00:51:42.981291" elapsed="0.000334"/>
</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-11T00:51:42.983983" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:42.983797" elapsed="0.000259"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.981683" elapsed="0.002402"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.984643" 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-11T00:51:42.984245" elapsed="0.000443"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.985230" 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-11T00:51:42.984851" elapsed="0.000421"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.985815" 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-11T00:51:42.985448" elapsed="0.000410"/>
</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-11T00:51:42.979952" elapsed="0.005966"/>
</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-11T00:51:42.972935" elapsed="0.013112"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.986227" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:42.986113" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:42.986095" elapsed="0.000224"/>
</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-11T00:51:42.989251" 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-11T00:51:42.988876" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:42.989746" 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-11T00:51:42.989454" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:42.989819" elapsed="0.000038"/>
</return>
<msg time="2026-04-11T00:51:42.989983" 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-11T00:51:42.988550" 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-11T00:51:42.990362" elapsed="0.000039"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:42.990169" elapsed="0.000270"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.990060" elapsed="0.000406"/>
</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-11T00:51:42.986556" elapsed="0.003964"/>
</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-11T00:51:42.990674" elapsed="0.000209"/>
</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-11T00:51:42.991184" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:42.991050" elapsed="0.000199"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.990934" 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-11T00:51:42.972496" elapsed="0.018832"/>
</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-11T00:51:42.995309" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:42.995194" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:42.995175" elapsed="0.000220"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:42.999920" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:42.999812" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:42.999794" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.000977" 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-11T00:51:43.000569" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.001474" 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-11T00:51:43.001165" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:43.001546" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:51:43.001706" 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-11T00:51:43.000219" elapsed="0.001512"/>
</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-11T00:51:43.002076" 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-11T00:51:43.002330" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:43.002173" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:43.002156" elapsed="0.000267"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:43.001934" elapsed="0.000513"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:43.001783" 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-11T00:51:42.999511" elapsed="0.003016"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-11T00:51:42.991901" elapsed="0.010757"/>
</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-11T00:51:42.991494" elapsed="0.011208"/>
</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-11T00:51:42.967446" elapsed="0.035307"/>
</kw>
<test id="s1-s3-t1" name="Check Shards Status Before Leader Restart" line="18">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:51:43.006003" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:51:43.005742" elapsed="0.000587"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:43.007341" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:43.007226" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:43.007206" elapsed="0.000223"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:43.012054" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:43.011941" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:43.011923" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.013118" 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-11T00:51:43.012733" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.013611" 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-11T00:51:43.013305" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:43.013682" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:51:43.013838" 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-11T00:51:43.012344" elapsed="0.001519"/>
</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-11T00:51:43.014204" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:43.014477" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:43.014319" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:43.014301" elapsed="0.000255"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:43.014064" elapsed="0.000516"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:43.013916" elapsed="0.000690"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:51:43.011583" elapsed="0.003075"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:51:43.006936" elapsed="0.007777"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:43.006501" elapsed="0.008257"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:51:43.003668" elapsed="0.011143"/>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T00:51:43.036591" elapsed="0.000242"/>
</kw>
<msg time="2026-04-11T00:51:43.036897" 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-11T00:51:43.035922" elapsed="0.001036"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default', 'entity-ownership'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:43.035457" elapsed="0.001586"/>
</kw>
<msg time="2026-04-11T00:51:43.037093" 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-11T00:51:43.027238" elapsed="0.009900"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T00:51:43.026813" elapsed="0.010402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.038272" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:51:43.037428" elapsed="0.000892"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T00:51:43.043522" 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-11T00:51:43.043113" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.044002" 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-11T00:51:43.043711" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:43.044078" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:51:43.044239" 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-11T00:51:43.042739" elapsed="0.001525"/>
</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-11T00:51:43.044444" elapsed="0.000161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.045131" level="INFO">${ds_type} = operational</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-11T00:51:43.044763" elapsed="0.000396"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.045583" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:43.045317" elapsed="0.000293"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.045992" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:43.045757" elapsed="0.000261"/>
</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-11T00:51:43.046499" 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-11T00:51:43.046762" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:43.046612" 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-11T00:51:43.046980" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:43.046841" elapsed="0.000194"/>
</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-11T00:51:43.047199" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:43.047058" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:43.046592" elapsed="0.000682"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:43.046311" elapsed="0.000987"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:43.046066" elapsed="0.001259"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:43.047365" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:51:43.047585" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:43.047632" 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-11T00:51:43.041945" elapsed="0.005711"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.048496" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:43.048600" 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-11T00:51:43.047858" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.049415" 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-11T00:51:43.049033" elapsed="0.000477">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:43.048722" elapsed="0.000874">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:43.048698" elapsed="0.000940">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-11T00:51:43.049852" 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-11T00:51:43.050100" elapsed="0.000028"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:43.050186" elapsed="0.000033"/>
</return>
<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>
<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-11T00:51:43.039353" elapsed="0.010988">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T00:51:43.039119" elapsed="0.011393">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T00:51:43.038977" elapsed="0.011608">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T00:51:43.038574" elapsed="0.012124">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:43.051012" elapsed="0.000031"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:43.015033" elapsed="0.036127">No leader found.</status>
</kw>
<doc>Check Status for all shards in OpenFlow application and set default flows variable.
Note that Boron and beyond use latest OVS 2.5 which means controller has to push table miss flow,
therefore Boron+ has 1 flow/switch more than Beryllium.</doc>
<status status="FAIL" start="2026-04-11T00:51:43.002815" elapsed="0.048523">No leader found.</status>
</test>
<test id="s1-s3-t2" name="Get inventory Leader Before Leader Restart" line="24">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:51:43.054712" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:51:43.054445" elapsed="0.000534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:43.055973" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:43.055857" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:43.055838" elapsed="0.000204"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:43.060706" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:43.060599" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:43.060580" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.061790" 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-11T00:51:43.061407" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.062303" 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-11T00:51:43.061978" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:43.062374" elapsed="0.000047"/>
</return>
<msg time="2026-04-11T00:51:43.062551" 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-11T00:51:43.061016" elapsed="0.001560"/>
</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-11T00:51:43.062915" 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-11T00:51:43.063154" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:43.063012" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:43.062994" elapsed="0.000238"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:43.062775" elapsed="0.000480"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:43.062627" elapsed="0.000651"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:51:43.060226" elapsed="0.003104"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:51:43.055570" elapsed="0.007830"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:43.055131" elapsed="0.008317"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:51:43.052243" elapsed="0.011257"/>
</kw>
<kw name="Get InventoryConfig Shard Status" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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-11T00:51:43.070477" 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-11T00:51:43.070061" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.070953" 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-11T00:51:43.070666" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:43.071063" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:51:43.071224" 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-11T00:51:43.069687" elapsed="0.001562"/>
</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-11T00:51:43.071417" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.072075" 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-11T00:51:43.071739" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.072522" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:43.072261" elapsed="0.000287"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.072939" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:43.072698" elapsed="0.000266"/>
</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-11T00:51:43.073360" elapsed="0.000039"/>
</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-11T00:51:43.073626" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:43.073481" 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-11T00:51:43.073845" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:43.073705" elapsed="0.000194"/>
</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-11T00:51:43.074062" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:43.073922" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:43.073463" elapsed="0.000673"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:43.073196" elapsed="0.000964"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:43.073012" elapsed="0.001172"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:43.074240" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:51:43.074460" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:43.074507" 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-11T00:51:43.068953" elapsed="0.005576"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.074964" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:43.075041" 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-11T00:51:43.074699" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:43.075651" 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-11T00:51:43.075349" elapsed="0.000365">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:43.075134" elapsed="0.000642">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:43.075116" elapsed="0.000692">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-11T00:51:43.075960" 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-11T00:51:43.076133" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:43.076200" elapsed="0.000016"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:43.066604" elapsed="0.009713">No leader found.</status>
</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-11T00:51:44.085947" 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-11T00:51:44.085225" elapsed="0.000768"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:44.086734" 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-11T00:51:44.086259" elapsed="0.000512"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:44.086844" elapsed="0.000058"/>
</return>
<msg time="2026-04-11T00:51:44.087103" 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-11T00:51:44.084619" elapsed="0.002522"/>
</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-11T00:51:44.087502" elapsed="0.000263"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:44.088507" 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-11T00:51:44.088002" elapsed="0.000544"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:44.089112" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:44.088772" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:44.089757" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:44.089357" elapsed="0.000443"/>
</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-11T00:51:44.090350" elapsed="0.000032"/>
</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-11T00:51:44.090640" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:44.090491" elapsed="0.000209"/>
</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-11T00:51:44.090876" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:44.090725" elapsed="0.000208"/>
</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-11T00:51:44.091102" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:44.090955" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:44.090470" elapsed="0.000719"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:44.090173" elapsed="0.001042"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:44.089879" elapsed="0.001363"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:44.091282" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:44.091505" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:44.091552" 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-11T00:51:44.083597" elapsed="0.007982"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:44.092052" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:44.092131" 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-11T00:51:44.091759" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:44.092766" 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-11T00:51:44.092476" elapsed="0.000363">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:44.092225" elapsed="0.000679">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:44.092207" elapsed="0.000729">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-11T00:51:44.093085" 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-11T00:51:44.093257" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:44.093323" elapsed="0.000014"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:44.077539" elapsed="0.015902">No leader found.</status>
</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-11T00:51:45.104570" 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-11T00:51:45.103529" elapsed="0.001115"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:45.105741" 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-11T00:51:45.105033" elapsed="0.000766"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:45.105904" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:51:45.106263" 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-11T00:51:45.102666" elapsed="0.003650"/>
</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-11T00:51:45.106889" elapsed="0.000373"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:45.108956" 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-11T00:51:45.107653" elapsed="0.001367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:45.110017" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:45.109460" elapsed="0.000618"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:45.110495" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:45.110241" elapsed="0.000280"/>
</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-11T00:51:45.110937" 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-11T00:51:45.111189" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:45.111044" 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-11T00:51:45.111432" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:45.111276" elapsed="0.000212"/>
</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-11T00:51:45.111650" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:45.111511" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:45.111025" elapsed="0.000698"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:45.110768" elapsed="0.000979"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:45.110574" elapsed="0.001199"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:45.111811" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:51:45.112010" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:45.112061" 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-11T00:51:45.100987" elapsed="0.011098"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:45.112550" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:45.112626" 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-11T00:51:45.112259" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:45.113243" 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-11T00:51:45.112941" elapsed="0.000384">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:45.112719" elapsed="0.000687">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:45.112702" elapsed="0.000738">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-11T00:51:45.113590" 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-11T00:51:45.113761" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:45.113825" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:45.095243" elapsed="0.018684">No leader found.</status>
</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-11T00:51:46.124803" 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-11T00:51:46.123676" elapsed="0.001195"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:46.125587" 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-11T00:51:46.125256" elapsed="0.000364"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:46.125680" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:51:46.125857" 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-11T00:51:46.122813" elapsed="0.003069"/>
</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-11T00:51:46.126039" elapsed="0.000172"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:46.126881" 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-11T00:51:46.126495" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:46.127347" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:46.127086" elapsed="0.000288"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:46.127795" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:46.127546" elapsed="0.000276"/>
</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-11T00:51:46.128289" 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-11T00:51:46.128580" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:46.128429" elapsed="0.000209"/>
</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-11T00:51:46.128803" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:46.128663" 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-11T00:51:46.129021" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:46.128881" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:46.128408" elapsed="0.000688"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:46.128113" elapsed="0.001010"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:46.127875" elapsed="0.001284"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:46.129202" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:51:46.129433" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:46.129483" 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-11T00:51:46.121131" elapsed="0.008376"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:46.129964" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:46.130040" 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-11T00:51:46.129682" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:46.130662" 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-11T00:51:46.130357" elapsed="0.000378">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:46.130137" elapsed="0.000666">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:46.130118" elapsed="0.000919">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-11T00:51:46.131195" 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-11T00:51:46.131371" elapsed="0.000036"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:46.131455" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:46.115028" elapsed="0.016532">No leader found.</status>
</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-11T00:51:47.141689" 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-11T00:51:47.141194" elapsed="0.000526"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:47.142190" 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-11T00:51:47.141892" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:47.142265" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:51:47.142453" 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-11T00:51:47.140305" elapsed="0.002173"/>
</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-11T00:51:47.142631" elapsed="0.000169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:47.143286" 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-11T00:51:47.142956" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:47.143816" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:47.143572" elapsed="0.000270"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:47.144250" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:47.144003" elapsed="0.000272"/>
</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-11T00:51:47.144720" 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-11T00:51:47.144978" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:47.144831" 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-11T00:51:47.145204" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:47.145058" 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-11T00:51:47.145435" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:47.145281" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:47.144812" elapsed="0.000699"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:47.144549" elapsed="0.000986"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:47.144330" elapsed="0.001232"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:47.145601" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:47.145803" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:47.145849" 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-11T00:51:47.138585" elapsed="0.007287"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:47.146316" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:47.146406" 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-11T00:51:47.146042" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:47.146997" 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-11T00:51:47.146715" elapsed="0.000354">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:47.146501" elapsed="0.000633">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:47.146483" elapsed="0.000682">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-11T00:51:47.147313" 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-11T00:51:47.147501" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:47.147567" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:47.132736" elapsed="0.014933">No leader found.</status>
</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-11T00:51:48.157700" 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-11T00:51:48.157215" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:48.158194" 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-11T00:51:48.157903" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:48.158268" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:51:48.158457" 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-11T00:51:48.156374" elapsed="0.002108"/>
</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-11T00:51:48.158633" elapsed="0.000168"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:48.159290" 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-11T00:51:48.158957" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:48.159723" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:48.159485" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:48.160212" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:48.159970" elapsed="0.000269"/>
</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-11T00:51:48.160675" 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-11T00:51:48.160928" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:48.160782" 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-11T00:51:48.161146" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:48.161008" 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-11T00:51:48.161364" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:48.161224" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:48.160764" elapsed="0.000691"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:48.160506" elapsed="0.000973"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:48.160291" elapsed="0.001214"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:48.161544" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:51:48.161743" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:48.161790" 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-11T00:51:48.154754" elapsed="0.007059"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:48.162259" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:48.162335" 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-11T00:51:48.161983" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:48.162940" 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-11T00:51:48.162658" elapsed="0.000353">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:48.162443" elapsed="0.000632">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:48.162425" elapsed="0.000682">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-11T00:51:48.163255" 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-11T00:51:48.163440" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:48.163507" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:48.148719" elapsed="0.014889">No leader found.</status>
</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-11T00:51:49.174408" 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-11T00:51:49.173737" elapsed="0.000720"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:49.175110" 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-11T00:51:49.174698" elapsed="0.000449"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:49.175214" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T00:51:49.175487" 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-11T00:51:49.172916" elapsed="0.002622"/>
</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-11T00:51:49.175835" elapsed="0.000329"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:49.176977" 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-11T00:51:49.176469" elapsed="0.000548"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:49.177609" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:49.177237" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:49.178206" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:49.177854" elapsed="0.000389"/>
</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-11T00:51:49.179058" elapsed="0.000050"/>
</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-11T00:51:49.179584" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:49.179283" elapsed="0.000391"/>
</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-11T00:51:49.179911" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:49.179711" elapsed="0.000277"/>
</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-11T00:51:49.180216" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:49.180021" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:49.179242" elapsed="0.001078"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:49.178731" elapsed="0.001624"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:49.178421" elapsed="0.001994"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:49.180475" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:51:49.180758" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:49.180836" 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-11T00:51:49.171640" elapsed="0.009233"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:49.181538" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:49.181659" 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-11T00:51:49.181112" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:49.182815" 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-11T00:51:49.182259" elapsed="0.000659">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:49.181819" elapsed="0.001191">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:49.181781" elapsed="0.001275">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-11T00:51:49.183271" elapsed="0.000030"/>
</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-11T00:51:49.183539" elapsed="0.000030"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:49.183634" elapsed="0.000022"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:49.164860" elapsed="0.018924">No leader found.</status>
</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-11T00:51:50.193962" 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-11T00:51:50.193481" elapsed="0.000515"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:50.194479" 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-11T00:51:50.194168" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:50.194556" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:51:50.194733" 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-11T00:51:50.192756" elapsed="0.002002"/>
</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-11T00:51:50.194930" elapsed="0.000175"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:50.195628" 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-11T00:51:50.195268" elapsed="0.000387"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:50.196068" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:50.195822" elapsed="0.000274"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:50.196507" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:50.196249" elapsed="0.000284"/>
</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-11T00:51:50.196979" elapsed="0.000026"/>
</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-11T00:51:50.197314" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:50.197162" elapsed="0.000209"/>
</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-11T00:51:50.197568" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:50.197423" elapsed="0.000201"/>
</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-11T00:51:50.197790" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:50.197648" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:50.197143" elapsed="0.000731"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:50.196789" elapsed="0.001111"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:50.196584" elapsed="0.001343"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:50.197969" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:50.198172" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:50.198219" 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-11T00:51:50.191050" elapsed="0.007192"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:50.198709" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:50.198788" 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-11T00:51:50.198431" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:50.199419" 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-11T00:51:50.199110" elapsed="0.000381">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:50.198891" elapsed="0.000667">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:50.198872" elapsed="0.000719">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-11T00:51:50.199743" 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-11T00:51:50.199935" elapsed="0.000023"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:50.200006" elapsed="0.000016"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:50.184852" elapsed="0.015261">No leader found.</status>
</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-11T00:51:51.207429" 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-11T00:51:51.206769" elapsed="0.000728"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:51.208246" 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-11T00:51:51.207779" elapsed="0.000506"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:51.208351" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:51:51.208617" 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-11T00:51:51.206182" elapsed="0.002469"/>
</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-11T00:51:51.208887" elapsed="0.000235"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:51.209847" 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-11T00:51:51.209344" elapsed="0.000542"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:51.210521" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:51.210151" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:51.211136" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:51.210785" elapsed="0.000388"/>
</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-11T00:51:51.211779" elapsed="0.000042"/>
</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-11T00:51:51.212277" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:51.212068" elapsed="0.000288"/>
</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-11T00:51:51.212620" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:51.212420" elapsed="0.000276"/>
</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-11T00:51:51.212934" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:51.212729" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:51.212037" elapsed="0.001004"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:51.211535" elapsed="0.001540"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:51.211248" elapsed="0.001864"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:51.213168" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:51:51.213517" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:51.213582" 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-11T00:51:51.205112" elapsed="0.008501"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:51.214298" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:51.214429" 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-11T00:51:51.213865" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:51.215308" 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-11T00:51:51.214900" elapsed="0.000529">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:51.214563" elapsed="0.000960">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:51.214537" elapsed="0.001030">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-11T00:51:51.215776" elapsed="0.000031"/>
</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-11T00:51:51.216130" elapsed="0.000035"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:51.216234" elapsed="0.000021"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:51.201166" elapsed="0.015214">No leader found.</status>
</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-11T00:51:52.225851" 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-11T00:51:52.225134" elapsed="0.000762"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:52.226632" 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-11T00:51:52.226132" elapsed="0.000538"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:52.226738" elapsed="0.000059"/>
</return>
<msg time="2026-04-11T00:51:52.226979" 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-11T00:51:52.224558" elapsed="0.002455"/>
</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-11T00:51:52.227225" elapsed="0.000269"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:52.228191" 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-11T00:51:52.227721" elapsed="0.000507"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:52.228823" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:52.228484" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:52.229509" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:52.229067" elapsed="0.000485"/>
</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-11T00:51:52.230174" elapsed="0.000035"/>
</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-11T00:51:52.230572" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:52.230327" elapsed="0.000445"/>
</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-11T00:51:52.231015" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:52.230810" elapsed="0.000282"/>
</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-11T00:51:52.231324" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:52.231126" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:52.230300" elapsed="0.001152"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:52.229939" elapsed="0.001587"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:52.229631" elapsed="0.001946"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:52.231640" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:51:52.231925" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:52.231989" 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-11T00:51:52.223458" elapsed="0.008563"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:52.232668" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:52.232774" 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-11T00:51:52.232259" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:52.233717" 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-11T00:51:52.233223" elapsed="0.000596">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:52.232916" elapsed="0.000995">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:52.232887" elapsed="0.001068">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-11T00:51:52.234167" 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-11T00:51:52.234452" elapsed="0.000031"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:52.234557" elapsed="0.000023"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:52.217523" elapsed="0.017193">No leader found.</status>
</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-11T00:51:53.247362" 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-11T00:51:53.246834" elapsed="0.000579"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.247876" 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-11T00:51:53.247584" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:53.247950" elapsed="0.000038"/>
</return>
<msg time="2026-04-11T00:51:53.248118" 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-11T00:51:53.246414" elapsed="0.001729"/>
</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-11T00:51:53.248295" elapsed="0.000188"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.248974" 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-11T00:51:53.248643" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.249408" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:53.249156" elapsed="0.000279"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.249835" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:53.249579" elapsed="0.000282"/>
</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-11T00:51:53.250281" 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-11T00:51:53.250552" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:53.250402" 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-11T00:51:53.250854" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:53.250632" elapsed="0.000278"/>
</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-11T00:51:53.251074" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:53.250934" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:53.250369" elapsed="0.000778"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:53.250114" elapsed="0.001057"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.249913" elapsed="0.001285"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:53.251238" elapsed="0.000026"/>
</return>
<msg time="2026-04-11T00:51:53.251452" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:53.251498" 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-11T00:51:53.244626" elapsed="0.006895"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.251964" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:53.252041" 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-11T00:51:53.251690" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.252658" 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-11T00:51:53.252349" elapsed="0.000385">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:53.252133" elapsed="0.000667">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:53.252115" elapsed="0.000717">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-11T00:51:53.252982" 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-11T00:51:53.253154" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.253219" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:53.235881" elapsed="0.017440">No leader found.</status>
</kw>
<msg time="2026-04-11T00:51:53.253471" level="FAIL">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</msg>
<var>${inv_conf_leader}</var>
<var>${inv_conf_followers_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Get_Leader_And_Followers_For_Shard</arg>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:51:43.065948" elapsed="10.187633">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.253797" elapsed="0.000022"/>
</kw>
<return>
<value>${inv_conf_leader}</value>
<value>${inv_conf_followers_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.253858" elapsed="0.000015"/>
</return>
<var>${inventory_leader}</var>
<var>${inventory_followers}</var>
<doc>Check Status for Inventory Config shard in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:43.063725" elapsed="10.190229">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${follower_node_1}</var>
<arg>${inventory_followers}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.254136" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${follower_node_2}</var>
<arg>${inventory_followers}</arg>
<arg>1</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.254321" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${inventory_leader_old}</arg>
<arg>${inventory_leader}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.254534" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower_node_1}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.254722" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower_node_2}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.254904" elapsed="0.000026"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${inventory_leader}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.255164" elapsed="0.000028"/>
</kw>
<doc>Find leader in the inventory config shard</doc>
<status status="FAIL" start="2026-04-11T00:51:43.051632" elapsed="10.203728">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</status>
</test>
<test id="s1-s3-t3" name="Start Mininet Connect To Follower Node1" line="34">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:51:53.304786" elapsed="0.000281"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:51:53.304478" elapsed="0.000659"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.306280" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:53.306145" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:53.306121" elapsed="0.000230"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.310947" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:53.310841" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:53.310823" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.312067" 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-11T00:51:53.311622" elapsed="0.000486"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.312617" 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-11T00:51:53.312300" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:53.312687" elapsed="0.000048"/>
</return>
<msg time="2026-04-11T00:51:53.312861" 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-11T00:51:53.311237" elapsed="0.001648"/>
</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-11T00:51:53.313240" 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-11T00:51:53.313497" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:53.313337" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:53.313320" elapsed="0.000253"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:53.313101" elapsed="0.000495"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.312939" elapsed="0.000684"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:51:53.310486" elapsed="0.003190"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:51:53.305842" elapsed="0.007886"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:53.305365" elapsed="0.008406"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:51:53.256248" elapsed="0.057572"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<msg time="2026-04-11T00:51:53.317928" level="FAIL">Variable '${follower_node_1}' not found.</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${follower_node_1}_IP}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="FAIL" start="2026-04-11T00:51:53.314119" elapsed="0.003851">Variable '${follower_node_1}' not found.</status>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>Wait until switch is available in controller</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.318165" elapsed="0.000021"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Verify Switch Connections Running On Member</arg>
<arg>1</arg>
<arg>${follower_node_1}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.318357" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.318569" elapsed="0.000020"/>
</kw>
<doc>Start mininet with connection to Follower Node1.</doc>
<status status="FAIL" start="2026-04-11T00:51:53.255616" elapsed="0.063106">Variable '${follower_node_1}' not found.</status>
</test>
<test id="s1-s3-t4" name="Add Flows In Follower Node2 and Verify Before Leader Restart" line="48">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:51:53.322040" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:51:53.321783" elapsed="0.000513"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.323263" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:53.323149" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:53.323131" elapsed="0.000204"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.327949" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:53.327842" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:53.327824" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.329059" 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-11T00:51:53.328640" elapsed="0.000446"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.329593" 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-11T00:51:53.329286" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:53.329662" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:53.329813" 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-11T00:51:53.328234" elapsed="0.001603"/>
</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-11T00:51:53.330169" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.330421" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:53.330264" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:53.330248" elapsed="0.000251"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:53.330033" elapsed="0.000489"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.329887" elapsed="0.000659"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:51:53.327483" elapsed="0.003114"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:51:53.322868" elapsed="0.007782"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:53.322458" elapsed="0.008235"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:51:53.319628" elapsed="0.011116"/>
</kw>
<kw name="Add Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:51:53.342612" level="FAIL">Variable '${follower_node_2}' not found.</msg>
<arg>${follower_node_2}</arg>
<doc>Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-11T00:51:53.338576" elapsed="0.004080">Variable '${follower_node_2}' not found.</status>
</kw>
<doc>Add Flow via Follower Node2 and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:51:53.318938" elapsed="0.023866">Variable '${follower_node_2}' not found.</status>
</test>
<test id="s1-s3-t5" name="Stop Mininet Connected To Follower Node1 and Exit" line="52">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:51:53.346192" elapsed="0.000247"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:51:53.345929" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.347499" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:53.347364" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:53.347342" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.352111" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:53.352006" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:53.351988" elapsed="0.000220"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.353203" 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-11T00:51:53.352824" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.353690" 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-11T00:51:53.353407" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:53.353759" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:51:53.353911" 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-11T00:51:53.352453" elapsed="0.001482"/>
</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-11T00:51:53.354276" 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-11T00:51:53.354530" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:53.354372" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:53.354355" elapsed="0.000251"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:53.354136" elapsed="0.000493"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.353987" elapsed="0.000668"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:51:53.351654" elapsed="0.003102"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:51:53.347073" elapsed="0.007738"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:53.346645" elapsed="0.008208"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:51:53.343745" elapsed="0.011158"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<msg time="2026-04-11T00:51:53.362591" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="FAIL" start="2026-04-11T00:51:53.358829" elapsed="0.003819">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<status status="NOT RUN" start="2026-04-11T00:51:53.362917" elapsed="0.000031"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="FAIL" start="2026-04-11T00:51:53.343165" elapsed="0.019910">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s3-t6" name="Restart Leader From Cluster Node" line="57">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:51:53.366376" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:51:53.366118" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.367612" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:53.367505" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:53.367486" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.372285" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:53.372180" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:53.372162" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.373335" 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-11T00:51:53.372958" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.373823" 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-11T00:51:53.373537" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:53.373894" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:53.374045" 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-11T00:51:53.372595" elapsed="0.001475"/>
</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-11T00:51:53.374424" 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-11T00:51:53.374666" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:53.374522" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:53.374506" elapsed="0.000236"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:53.374269" elapsed="0.000496"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.374122" elapsed="0.000668"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:51:53.371808" elapsed="0.003034"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:51:53.367208" elapsed="0.007688"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:53.366797" elapsed="0.008144"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:51:53.363982" elapsed="0.011010"/>
</kw>
<kw name="Stop_Single_Member" owner="ClusterManagement">
<msg time="2026-04-11T00:51:53.379157" level="FAIL">Variable '${inventory_leader}' not found.</msg>
<arg>${inventory_leader}</arg>
<doc>Convenience keyword that stops the specified member of the cluster.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member}</doc>
<status status="FAIL" start="2026-04-11T00:51:53.375237" elapsed="0.003961">Variable '${inventory_leader}' not found.</status>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<arg>${inventory_leader}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.379441" elapsed="0.000026"/>
</kw>
<doc>Stop Leader Node and Start it Up, Verify it is sync with other controller node.</doc>
<status status="FAIL" start="2026-04-11T00:51:53.363396" elapsed="0.016195">Variable '${inventory_leader}' not found.</status>
</test>
<test id="s1-s3-t7" name="Get inventory Follower After Leader Restart" line="62">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:51:53.382990" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:51:53.382725" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.384356" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:53.384246" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:53.384226" elapsed="0.000221"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.389005" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:51:53.388900" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-11T00:51:53.388882" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.390050" 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-11T00:51:53.389672" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.390532" 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-11T00:51:53.390234" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:53.390602" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:51:53.390754" 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-11T00:51:53.389290" elapsed="0.001488"/>
</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-11T00:51:53.391115" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:51:53.391349" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:53.391209" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:53.391193" elapsed="0.000248"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:53.390977" elapsed="0.000487"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.390829" elapsed="0.000660"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:51:53.388546" elapsed="0.002993"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:51:53.383954" elapsed="0.007648"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:51:53.383438" elapsed="0.008208"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:51:53.380529" elapsed="0.011167"/>
</kw>
<kw name="Get InventoryConfig Shard Status" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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-11T00:51:53.398434" 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-11T00:51:53.398043" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.398906" 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-11T00:51:53.398622" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:53.398977" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:53.399128" 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-11T00:51:53.397677" elapsed="0.001475"/>
</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-11T00:51:53.399302" elapsed="0.000208"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.399998" 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-11T00:51:53.399669" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.400431" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:53.400179" elapsed="0.000279"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.400838" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:53.400603" 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-11T00:51:53.401252" 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-11T00:51:53.401573" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:53.401416" elapsed="0.000231"/>
</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-11T00:51:53.401840" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:53.401680" elapsed="0.000217"/>
</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-11T00:51:53.402063" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:53.401921" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:53.401397" elapsed="0.000741"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:53.401088" elapsed="0.001074"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.400910" elapsed="0.001277"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:53.402226" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:51:53.402444" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:53.402491" 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-11T00:51:53.396962" elapsed="0.005552"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.402962" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:53.403040" 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-11T00:51:53.402686" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:53.403660" 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-11T00:51:53.403347" elapsed="0.000385">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:53.403132" elapsed="0.000663">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:53.403114" elapsed="0.000712">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-11T00:51:53.403976" 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-11T00:51:53.404147" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:53.404212" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:53.394490" elapsed="0.009823">No leader found.</status>
</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-11T00:51:54.414658" 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-11T00:51:54.414011" elapsed="0.000679"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:54.415158" 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-11T00:51:54.414863" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:54.415232" elapsed="0.000038"/>
</return>
<msg time="2026-04-11T00:51:54.415414" 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-11T00:51:54.413094" elapsed="0.002346"/>
</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-11T00:51:54.415595" elapsed="0.000167"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:54.416256" 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-11T00:51:54.415921" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:54.416700" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:54.416457" elapsed="0.000270"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:54.417115" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:54.416876" elapsed="0.000265"/>
</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-11T00:51:54.417573" 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-11T00:51:54.417909" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:54.417761" elapsed="0.000206"/>
</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-11T00:51:54.418134" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:54.417993" 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-11T00:51:54.418352" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:54.418212" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:54.417741" elapsed="0.000706"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:54.417405" elapsed="0.001067"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:54.417192" elapsed="0.001306"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:54.418538" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:54.418740" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:54.418786" 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-11T00:51:54.411442" elapsed="0.007368"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:54.419256" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:54.419333" 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-11T00:51:54.418979" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:54.419946" 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-11T00:51:54.419660" elapsed="0.000354">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:54.419444" elapsed="0.000636">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:54.419425" elapsed="0.000686">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-11T00:51:54.420260" 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-11T00:51:54.420448" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:54.420515" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:54.405316" elapsed="0.015303">No leader found.</status>
</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-11T00:51:55.431136" 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-11T00:51:55.430662" elapsed="0.000507"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:55.431650" 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-11T00:51:55.431338" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:55.431725" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:51:55.431899" 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-11T00:51:55.429846" elapsed="0.002077"/>
</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-11T00:51:55.432076" elapsed="0.000169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:55.432748" 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-11T00:51:55.432417" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:55.433165" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:55.432929" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:55.433633" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:55.433336" elapsed="0.000333"/>
</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-11T00:51:55.434090" elapsed="0.000027"/>
</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-11T00:51:55.434349" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:55.434200" elapsed="0.000303"/>
</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-11T00:51:55.434677" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:55.434532" 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-11T00:51:55.434896" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:55.434755" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:55.434181" elapsed="0.000788"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:55.433915" elapsed="0.001078"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:55.433723" elapsed="0.001297"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:55.435058" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:51:55.435262" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:55.435307" 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-11T00:51:55.428070" elapsed="0.007260"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:55.435795" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:55.435871" 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-11T00:51:55.435523" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:55.436479" 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-11T00:51:55.436177" elapsed="0.000372">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:55.435963" elapsed="0.000651">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:55.435946" elapsed="0.000701">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-11T00:51:55.436798" elapsed="0.000025"/>
</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-11T00:51:55.436991" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:55.437060" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:55.421702" elapsed="0.015465">No leader found.</status>
</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-11T00:51:56.447643" 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-11T00:51:56.446659" elapsed="0.001018"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:56.448140" 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-11T00:51:56.447849" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:56.448215" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:51:56.448403" 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-11T00:51:56.445800" elapsed="0.002629"/>
</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-11T00:51:56.448581" elapsed="0.000169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:56.449232" 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-11T00:51:56.448906" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:56.449661" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:56.449427" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:56.450059" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:56.449828" elapsed="0.000256"/>
</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-11T00:51:56.450511" 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-11T00:51:56.450766" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:56.450621" 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-11T00:51:56.451073" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:56.450846" elapsed="0.000293"/>
</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-11T00:51:56.451305" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:56.451163" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:56.450601" elapsed="0.000796"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:56.450325" elapsed="0.001099"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:56.450135" elapsed="0.001316"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:56.451491" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:56.451691" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:56.451736" 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-11T00:51:56.444154" elapsed="0.007605"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:56.452199" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:56.452275" 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-11T00:51:56.451927" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:56.452877" 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-11T00:51:56.452595" elapsed="0.000353">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:56.452365" elapsed="0.000647">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:56.452348" 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-11T00:51:56.453191" 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-11T00:51:56.453359" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:56.453440" elapsed="0.000018"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:56.438189" elapsed="0.015366">No leader found.</status>
</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-11T00:51:57.463264" 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-11T00:51:57.462797" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:57.463773" 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-11T00:51:57.463480" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:57.463848" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:51:57.464019" 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-11T00:51:57.462197" elapsed="0.001846"/>
</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-11T00:51:57.464195" elapsed="0.000169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:57.464871" 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-11T00:51:57.464543" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:57.465284" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:57.465050" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:57.465703" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:57.465467" elapsed="0.000261"/>
</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-11T00:51:57.466150" 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-11T00:51:57.466418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:57.466256" 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-11T00:51:57.466639" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:57.466500" elapsed="0.000192"/>
</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-11T00:51:57.466935" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:57.466788" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:57.466238" elapsed="0.000773"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:57.465984" elapsed="0.001051"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:57.465780" elapsed="0.001281"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:57.467101" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:57.467300" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:57.467345" 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-11T00:51:57.460543" elapsed="0.006825"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:57.467833" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:57.467908" 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-11T00:51:57.467557" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:57.468510" 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-11T00:51:57.468211" elapsed="0.000371">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:57.467998" elapsed="0.000650">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:57.467981" elapsed="0.000697">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-11T00:51:57.468826" elapsed="0.000020"/>
</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-11T00:51:57.468995" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:57.469060" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:57.454616" elapsed="0.014547">No leader found.</status>
</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-11T00:51:58.479342" 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-11T00:51:58.478876" elapsed="0.000499"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:58.479877" 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-11T00:51:58.479575" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:58.479952" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:51:58.480126" 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-11T00:51:58.478166" elapsed="0.001986"/>
</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-11T00:51:58.480306" elapsed="0.000194"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:58.481010" 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-11T00:51:58.480664" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:58.481464" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:58.481195" elapsed="0.000303"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:58.481914" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:58.481650" elapsed="0.000291"/>
</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-11T00:51:58.482359" elapsed="0.000039"/>
</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-11T00:51:58.482650" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:58.482498" elapsed="0.000210"/>
</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-11T00:51:58.482873" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:58.482732" elapsed="0.000197"/>
</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-11T00:51:58.483093" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:58.482952" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:58.482472" elapsed="0.000771"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:58.482188" elapsed="0.001080"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:58.481994" elapsed="0.001300"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:58.483335" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:51:58.483564" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:58.483611" 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-11T00:51:58.476453" elapsed="0.007185"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:58.484089" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:58.484165" 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-11T00:51:58.483811" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:58.484794" 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-11T00:51:58.484495" elapsed="0.000371">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:58.484258" elapsed="0.000677">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:58.484240" elapsed="0.000727">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-11T00:51:58.485118" 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-11T00:51:58.485320" elapsed="0.000027"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:58.485421" elapsed="0.000018"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:58.470257" elapsed="0.015297">No leader found.</status>
</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-11T00:51:59.494964" 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-11T00:51:59.494287" elapsed="0.000724"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:59.495731" 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-11T00:51:59.495283" elapsed="0.000487"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:51:59.495839" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:51:59.496078" 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-11T00:51:59.493582" elapsed="0.002541"/>
</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-11T00:51:59.496349" elapsed="0.000260"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:51:59.497322" 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-11T00:51:59.496836" elapsed="0.000525"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:59.497948" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:59.497609" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:51:59.498594" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:51:59.498211" elapsed="0.000423"/>
</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-11T00:51:59.499222" elapsed="0.000035"/>
</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-11T00:51:59.499608" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:59.499373" elapsed="0.000318"/>
</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-11T00:51:59.499926" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:59.499729" elapsed="0.000274"/>
</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-11T00:51:59.500253" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:51:59.500037" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:51:59.499346" elapsed="0.001019"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:51:59.498978" elapsed="0.001446"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:59.498710" elapsed="0.001839"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:51:59.500612" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:51:59.500896" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:51:59.500962" 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-11T00:51:59.492528" elapsed="0.008468"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:51:59.501660" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:51:59.501768" 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-11T00:51:59.501245" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:51:59.502676" 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-11T00:51:59.502209" elapsed="0.000567">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:51:59.501902" elapsed="0.000967">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:51:59.501876" elapsed="0.001041">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-11T00:51:59.503130" elapsed="0.000031"/>
</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-11T00:51:59.503404" elapsed="0.000035"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:51:59.503522" elapsed="0.000027"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:51:59.486659" elapsed="0.017027">No leader found.</status>
</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-11T00:52:00.513579" 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-11T00:52:00.512940" elapsed="0.000681"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:00.514263" 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-11T00:52:00.513855" elapsed="0.000444"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:00.514365" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:52:00.514626" 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-11T00:52:00.512404" elapsed="0.002256"/>
</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-11T00:52:00.514872" elapsed="0.000228"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:00.515808" 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-11T00:52:00.515319" elapsed="0.000526"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:00.516439" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:00.516064" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:00.517010" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:00.516681" elapsed="0.000365"/>
</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-11T00:52:00.517627" elapsed="0.000033"/>
</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-11T00:52:00.517978" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:00.517776" elapsed="0.000278"/>
</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-11T00:52:00.518282" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:00.518089" elapsed="0.000268"/>
</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-11T00:52:00.518607" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:00.518410" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:00.517750" elapsed="0.000960"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:00.517375" elapsed="0.001369"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:00.517116" elapsed="0.001664"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:00.518834" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:52:00.519193" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:00.519258" 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-11T00:52:00.511338" elapsed="0.007952"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:00.519921" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:00.520027" 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-11T00:52:00.519545" elapsed="0.000515"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:00.520878" 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-11T00:52:00.520492" elapsed="0.000479">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:00.520154" elapsed="0.000905">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:00.520130" elapsed="0.000973">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-11T00:52:00.521366" elapsed="0.000048"/>
</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-11T00:52:00.521634" elapsed="0.000029"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:00.521726" elapsed="0.000022"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:00.504854" elapsed="0.017019">No leader found.</status>
</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-11T00:52:01.532134" 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-11T00:52:01.531650" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:01.532662" 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-11T00:52:01.532344" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:01.532739" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:52:01.532913" 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-11T00:52:01.530769" elapsed="0.002170"/>
</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-11T00:52:01.533096" elapsed="0.000190"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:01.534155" 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-11T00:52:01.533465" elapsed="0.000729"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:01.534702" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:01.534406" elapsed="0.000323"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:01.535124" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:01.534880" elapsed="0.000271"/>
</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-11T00:52:01.535597" elapsed="0.000033"/>
</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-11T00:52:01.535870" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:01.535721" 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-11T00:52:01.536091" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:01.535951" 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-11T00:52:01.536308" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:01.536167" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:01.535700" elapsed="0.000681"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:01.535418" elapsed="0.001005"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:01.535206" elapsed="0.001243"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:01.536489" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:01.536693" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:01.536739" 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-11T00:52:01.528961" elapsed="0.007801"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:01.537285" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:01.537363" 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-11T00:52:01.537006" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:01.538111" 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-11T00:52:01.537742" elapsed="0.000462">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:01.537475" elapsed="0.000820">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:01.537457" elapsed="0.000885">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-11T00:52:01.538568" elapsed="0.000045"/>
</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-11T00:52:01.538780" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:01.538847" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:01.523239" elapsed="0.015712">No leader found.</status>
</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-11T00:52:02.549135" 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-11T00:52:02.548164" elapsed="0.001038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:02.550311" 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-11T00:52:02.549607" elapsed="0.000764"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:02.550511" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:52:02.550737" 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-11T00:52:02.547298" elapsed="0.003464"/>
</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-11T00:52:02.550915" elapsed="0.000167"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:02.551589" 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-11T00:52:02.551242" elapsed="0.000375"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:02.552009" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:02.551772" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:02.552430" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:02.552182" elapsed="0.000274"/>
</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-11T00:52:02.552878" 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-11T00:52:02.553138" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:02.552989" 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-11T00:52:02.553358" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:02.553219" elapsed="0.000208"/>
</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-11T00:52:02.553594" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:02.553451" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:02.552969" elapsed="0.000698"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:02.552709" elapsed="0.000995"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:02.552512" elapsed="0.001220"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:02.553781" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:02.553982" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:02.554027" 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-11T00:52:02.545657" elapsed="0.008393"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:02.554610" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:02.554687" 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-11T00:52:02.554309" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:02.555284" 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-11T00:52:02.554996" elapsed="0.000364">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:02.554780" elapsed="0.000666">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:02.554762" elapsed="0.000717">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-11T00:52:02.555637" 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-11T00:52:02.555809" elapsed="0.000219"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:02.556082" elapsed="0.000016"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:02.539961" elapsed="0.016228">No leader found.</status>
</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-11T00:52:03.566099" 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-11T00:52:03.565339" elapsed="0.000804"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.566808" 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-11T00:52:03.566376" elapsed="0.000469"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:03.566912" elapsed="0.000052"/>
</return>
<msg time="2026-04-11T00:52:03.567156" 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-11T00:52:03.564495" elapsed="0.002696"/>
</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-11T00:52:03.567427" elapsed="0.000236"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.568355" 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-11T00:52:03.567887" elapsed="0.000526"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.568969" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:03.568635" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.569626" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:03.569208" elapsed="0.000449"/>
</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-11T00:52:03.570079" 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-11T00:52:03.570335" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:03.570188" 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-11T00:52:03.570574" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:03.570432" 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-11T00:52:03.570793" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:03.570652" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:03.570170" elapsed="0.000698"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:03.569903" elapsed="0.000989"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.569710" elapsed="0.001209"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:03.570958" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:52:03.571160" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:03.571206" 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-11T00:52:03.562849" elapsed="0.008380"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.571693" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:03.571769" 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-11T00:52:03.571413" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.572461" 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-11T00:52:03.572158" elapsed="0.000376">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:03.571938" elapsed="0.000663">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:03.571919" elapsed="0.000714">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-11T00:52:03.572783" 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-11T00:52:03.572953" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.573018" elapsed="0.000014"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:03.557230" elapsed="0.015892">No leader found.</status>
</kw>
<msg time="2026-04-11T00:52:03.573214" level="FAIL">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</msg>
<var>${inv_conf_leader}</var>
<var>${inv_conf_followers_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Get_Leader_And_Followers_For_Shard</arg>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:51:53.393889" elapsed="10.179419">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.573550" elapsed="0.000022"/>
</kw>
<return>
<value>${inv_conf_leader}</value>
<value>${inv_conf_followers_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.573613" elapsed="0.000015"/>
</return>
<var>${inventory_leader}</var>
<var>${inventory_followers}</var>
<doc>Check Status for Inventory Config shard in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:51:53.391914" elapsed="10.181798">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${follower_node_1}</var>
<arg>${inventory_followers}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.573903" elapsed="0.000022"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${follower_node_2}</var>
<arg>${inventory_followers}</arg>
<arg>1</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.574093" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower_node_1}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.574291" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower_node_2}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.574494" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${inventory_leader}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.574681" elapsed="0.000020"/>
</kw>
<doc>Find new Followers and Leader in the inventory config shard After Leader Restart.</doc>
<status status="FAIL" start="2026-04-11T00:51:53.379900" elapsed="10.194937">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</status>
</test>
<test id="s1-s3-t8" name="Start Mininet Connect To Old Leader" line="71">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:03.578273" elapsed="0.000235"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:03.578009" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.579562" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:03.579452" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:03.579431" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.584212" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:03.584106" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:03.584088" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.585265" 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-11T00:52:03.584891" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.585789" 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-11T00:52:03.585503" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:03.585860" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:52:03.586014" 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-11T00:52:03.584515" elapsed="0.001523"/>
</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-11T00:52:03.586371" elapsed="0.000071"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.586671" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:03.586523" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:03.586505" elapsed="0.000242"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:03.586234" elapsed="0.000536"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.586088" elapsed="0.000707"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:03.583750" elapsed="0.003096"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:03.579152" elapsed="0.007749"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:03.578718" elapsed="0.008227"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:03.575699" elapsed="0.011298"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<msg time="2026-04-11T00:52:03.591124" level="FAIL">Variable '${inventory_leader_old}' not found.</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${inventory_leader_old}_IP}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="FAIL" start="2026-04-11T00:52:03.587288" elapsed="0.003875">Variable '${inventory_leader_old}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.591356" elapsed="0.000021"/>
</kw>
<doc>Start mininet with connection to cluster old leader.</doc>
<status status="FAIL" start="2026-04-11T00:52:03.575189" elapsed="0.016323">Variable '${inventory_leader_old}' not found.</status>
</test>
<test id="s1-s3-t9" name="Verify Flows In Switch After Leader Restart" line="78">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:03.594782" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:03.594525" elapsed="0.000516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.595996" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:03.595889" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:03.595871" 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-11T00:52:03.600625" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:03.600517" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:03.600498" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.601695" 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-11T00:52:03.601297" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.602162" 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-11T00:52:03.601880" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:03.602231" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:52:03.602396" 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-11T00:52:03.600909" elapsed="0.001513"/>
</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-11T00:52:03.602757" 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-11T00:52:03.602995" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:03.602853" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:03.602836" elapsed="0.000234"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:03.602620" elapsed="0.000473"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.602472" elapsed="0.000646"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:03.600146" elapsed="0.003024"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:03.595610" elapsed="0.007613"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:03.595187" elapsed="0.008080"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:03.592316" elapsed="0.011039"/>
</kw>
<kw name="Verify Sample Flow" owner="ClusterOpenFlow">
<if>
<branch type="IF" condition="'${ODL_OF_PLUGIN}' == 'helium'">
<kw name="Set Test Variable" owner="BuiltIn">
<arg>&amp;{dictionary}</arg>
<arg>10.0.1.0/24=2</arg>
<arg>"output-node-connector":"1"=1</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.609402" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:03.609122" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:03.609105" elapsed="0.000385"/>
</if>
<if>
<branch type="IF" condition="'${ODL_OF_PLUGIN}' == 'lithium'">
<kw name="Set Test Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.612638" level="INFO">&amp;{dictionary} = { 10.0.1.0/24=1 | "output-node-connector":"1"=1 }</msg>
<arg>&amp;{dictionary}</arg>
<arg>10.0.1.0/24=1</arg>
<arg>"output-node-connector":"1"=1</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="PASS" start="2026-04-11T00:52:03.609779" elapsed="0.002906"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:03.609543" elapsed="0.003182"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:03.609528" elapsed="0.003221"/>
</if>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.618869" 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-11T00:52:03.618494" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.619334" 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-11T00:52:03.619054" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:03.619425" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:52:03.619579" 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-11T00:52:03.618098" elapsed="0.001506"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.623689" elapsed="0.000026"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.623934" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:03.619769" elapsed="0.004224"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.619655" elapsed="0.004364"/>
</for>
<arg>uri=${operational_table_0}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'10.0.1.0/24': '1', '"output-node-connector":"1"': '1'}.</doc>
<status status="PASS" start="2026-04-11T00:52:03.617536" elapsed="0.006538"/>
</kw>
<arg>15s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${operational_table_0}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:52:03.612920" elapsed="0.011205"/>
</kw>
<doc>Verify sample flow gets applied in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-11T00:52:03.607275" elapsed="0.016912"/>
</kw>
<doc>Verify flows are installed in switch after leader restart.</doc>
<status status="PASS" start="2026-04-11T00:52:03.591791" elapsed="0.032489"/>
</test>
<test id="s1-s3-t10" name="Stop Mininet Connected To Old Leader and Exit" line="82">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:03.627268" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:03.627014" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.628498" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:03.628374" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:03.628355" elapsed="0.000218"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.633150" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:03.633022" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:03.633004" elapsed="0.000219"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.634201" 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-11T00:52:03.633829" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.634687" 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-11T00:52:03.634402" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:03.634757" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:03.634908" 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-11T00:52:03.633460" elapsed="0.001472"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.635263" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.635558" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:03.635413" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:03.635380" elapsed="0.000255"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:03.635125" elapsed="0.000534"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.634982" elapsed="0.000701"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:03.632668" elapsed="0.003066"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:03.628095" elapsed="0.007693"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:03.627688" elapsed="0.008144"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:03.625034" elapsed="0.010849"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<msg time="2026-04-11T00:52:03.643801" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="FAIL" start="2026-04-11T00:52:03.640033" elapsed="0.003808">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<status status="NOT RUN" start="2026-04-11T00:52:03.644052" elapsed="0.000024"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="FAIL" start="2026-04-11T00:52:03.624539" elapsed="0.019650">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s3-t11" name="Restart Follower Node2" line="87">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:03.647252" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:03.646998" elapsed="0.000534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.648500" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:03.648375" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:03.648356" 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-11T00:52:03.653109" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:03.652979" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:03.652961" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.654145" 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-11T00:52:03.653776" elapsed="0.000396"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.654628" 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-11T00:52:03.654328" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:03.654697" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:03.654847" 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-11T00:52:03.653408" elapsed="0.001463"/>
</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-11T00:52:03.655213" 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-11T00:52:03.655465" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:03.655308" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:03.655292" elapsed="0.000250"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:03.655074" elapsed="0.000491"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.654922" elapsed="0.000667"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:03.652628" elapsed="0.003012"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:03.648094" elapsed="0.007600"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:03.647679" elapsed="0.008057"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:03.645030" elapsed="0.010756"/>
</kw>
<kw name="Stop_Single_Member" owner="ClusterManagement">
<msg time="2026-04-11T00:52:03.659966" level="FAIL">Variable '${follower_node_2}' not found.</msg>
<arg>${follower_node_2}</arg>
<doc>Convenience keyword that stops the specified member of the cluster.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member}</doc>
<status status="FAIL" start="2026-04-11T00:52:03.656066" elapsed="0.003938">Variable '${follower_node_2}' not found.</status>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<arg>${follower_node_2}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:03.660230" elapsed="0.000024"/>
</kw>
<doc>Stop Follower Node2 and Start it Up, Verify it is sync with other controller node.</doc>
<status status="FAIL" start="2026-04-11T00:52:03.644477" elapsed="0.015897">Variable '${follower_node_2}' not found.</status>
</test>
<test id="s1-s3-t12" name="Get inventory Follower After Follower Restart" line="92">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:03.663537" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:03.663264" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.664774" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:03.664668" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:03.664648" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.669409" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:03.669287" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:03.669269" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.670467" 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-11T00:52:03.670064" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.670933" 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-11T00:52:03.670652" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:03.671003" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:03.671153" 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-11T00:52:03.669694" elapsed="0.001483"/>
</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-11T00:52:03.671526" 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-11T00:52:03.671761" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:03.671621" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:03.671605" elapsed="0.000230"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:03.671372" elapsed="0.000485"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.671228" elapsed="0.000654"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:03.668935" elapsed="0.002997"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:03.664372" elapsed="0.007613"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:03.663957" elapsed="0.008072"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:03.661237" elapsed="0.010842"/>
</kw>
<kw name="Get InventoryConfig Shard Status" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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-11T00:52:03.678797" 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-11T00:52:03.678412" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.679261" 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-11T00:52:03.678981" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:03.679331" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:03.679499" 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-11T00:52:03.678035" elapsed="0.001488"/>
</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-11T00:52:03.679672" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.680351" 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-11T00:52:03.680021" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.680785" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:03.680551" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.681211" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:03.680975" elapsed="0.000261"/>
</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-11T00:52:03.681640" 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-11T00:52:03.681883" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:03.681742" elapsed="0.000196"/>
</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-11T00:52:03.682100" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:03.681962" elapsed="0.000192"/>
</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-11T00:52:03.682316" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:03.682177" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:03.681725" elapsed="0.000687"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:03.681477" elapsed="0.000960"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.681283" elapsed="0.001178"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:03.682500" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:03.682696" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:03.682741" 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-11T00:52:03.677321" elapsed="0.005442"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.683192" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:03.683272" 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-11T00:52:03.682932" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:03.683865" 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-11T00:52:03.683603" elapsed="0.000322">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:03.683371" elapsed="0.000615">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:03.683353" elapsed="0.000664">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-11T00:52:03.684166" 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-11T00:52:03.684336" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:03.684417" elapsed="0.000016"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:03.674990" elapsed="0.009530">No leader found.</status>
</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-11T00:52:04.694362" 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-11T00:52:04.693907" elapsed="0.000505"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:04.694874" 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-11T00:52:04.694582" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:04.694952" elapsed="0.000038"/>
</return>
<msg time="2026-04-11T00:52:04.695118" 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-11T00:52:04.693265" elapsed="0.001878"/>
</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-11T00:52:04.695295" elapsed="0.000181"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:04.695964" 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-11T00:52:04.695634" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:04.696481" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:04.696223" elapsed="0.000284"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:04.696899" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:04.696655" elapsed="0.000271"/>
</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-11T00:52:04.697366" elapsed="0.000041"/>
</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-11T00:52:04.697639" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:04.697493" 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-11T00:52:04.697860" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:04.697720" 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-11T00:52:04.698077" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:04.697938" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:04.697474" elapsed="0.000678"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:04.697194" elapsed="0.000981"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:04.696977" elapsed="0.001225"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:04.698242" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:04.698458" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:04.698505" 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-11T00:52:04.691584" elapsed="0.006944"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:04.698967" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:04.699044" 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-11T00:52:04.698697" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:04.699654" 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-11T00:52:04.699349" elapsed="0.000391">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:04.699135" elapsed="0.000684">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:04.699118" elapsed="0.000735">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-11T00:52:04.700003" elapsed="0.000023"/>
</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-11T00:52:04.700176" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:04.700241" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:04.685599" elapsed="0.014744">No leader found.</status>
</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-11T00:52:05.711168" 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-11T00:52:05.710236" elapsed="0.000971"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:05.711694" 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-11T00:52:05.711399" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:05.711769" elapsed="0.000051"/>
</return>
<msg time="2026-04-11T00:52:05.711957" 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-11T00:52:05.708925" elapsed="0.003057"/>
</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-11T00:52:05.712139" elapsed="0.000167"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:05.712805" 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-11T00:52:05.712477" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:05.713217" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:05.712984" elapsed="0.000258"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:05.713740" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:05.713466" elapsed="0.000302"/>
</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-11T00:52:05.714179" 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-11T00:52:05.714446" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:05.714285" elapsed="0.000228"/>
</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-11T00:52:05.714678" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:05.714538" elapsed="0.000194"/>
</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-11T00:52:05.714895" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:05.714756" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:05.714267" elapsed="0.000702"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:05.714011" elapsed="0.000982"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:05.713824" elapsed="0.001195"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:05.715058" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:05.715257" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:05.715302" 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-11T00:52:05.707284" elapsed="0.008042"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:05.715783" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:05.715860" 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-11T00:52:05.715512" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:05.716487" 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-11T00:52:05.716176" elapsed="0.000399">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:05.715959" elapsed="0.000681">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:05.715942" elapsed="0.000730">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-11T00:52:05.716821" 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-11T00:52:05.716990" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:05.717055" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:05.701419" elapsed="0.015737">No leader found.</status>
</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-11T00:52:06.728612" 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-11T00:52:06.727600" elapsed="0.001081"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:06.729815" 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-11T00:52:06.729111" elapsed="0.000763"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:06.729987" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:52:06.730433" 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-11T00:52:06.726708" elapsed="0.003790"/>
</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-11T00:52:06.730897" elapsed="0.000374"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:06.732061" 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-11T00:52:06.731664" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:06.732494" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:06.732242" elapsed="0.000277"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:06.732904" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:06.732665" elapsed="0.000265"/>
</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-11T00:52:06.733468" elapsed="0.000026"/>
</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-11T00:52:06.733731" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:06.733582" 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-11T00:52:06.733952" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:06.733813" 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-11T00:52:06.734168" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:06.734029" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:06.733563" elapsed="0.000679"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:06.733272" elapsed="0.000995"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:06.733071" elapsed="0.001224"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:06.734336" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:52:06.734554" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:06.734599" 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-11T00:52:06.725047" elapsed="0.009576"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:06.735087" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:06.735163" 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-11T00:52:06.734809" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:06.735804" 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-11T00:52:06.735502" elapsed="0.000383">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:06.735254" elapsed="0.000700">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:06.735237" elapsed="0.000749">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-11T00:52:06.736138" 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-11T00:52:06.736313" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:06.736395" elapsed="0.000017"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:06.718264" elapsed="0.018242">No leader found.</status>
</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-11T00:52:07.749603" 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-11T00:52:07.748639" elapsed="0.001032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:07.750853" 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-11T00:52:07.750051" elapsed="0.000864"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:07.751049" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:52:07.751458" 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-11T00:52:07.747741" elapsed="0.003777"/>
</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-11T00:52:07.751874" elapsed="0.000412"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:07.753077" 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-11T00:52:07.752706" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:07.753522" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:07.753261" elapsed="0.000295"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:07.753948" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:07.753706" elapsed="0.000269"/>
</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-11T00:52:07.754421" elapsed="0.000030"/>
</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-11T00:52:07.754791" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:07.754638" elapsed="0.000209"/>
</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-11T00:52:07.755010" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:07.754873" elapsed="0.000190"/>
</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-11T00:52:07.755242" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:07.755089" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:07.754614" elapsed="0.000706"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:07.754222" elapsed="0.001123"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:07.754029" elapsed="0.001344"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:07.755438" elapsed="0.000036"/>
</return>
<msg time="2026-04-11T00:52:07.755659" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:07.755721" 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-11T00:52:07.746108" elapsed="0.009643"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:07.756235" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:07.756312" 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-11T00:52:07.755923" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:07.756917" 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-11T00:52:07.756636" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:07.756420" elapsed="0.000636">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:07.756402" elapsed="0.000685">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-11T00:52:07.757235" 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-11T00:52:07.757418" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:07.757485" elapsed="0.000014"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:07.737535" elapsed="0.020066">No leader found.</status>
</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-11T00:52:08.767546" 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-11T00:52:08.766591" elapsed="0.001022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:08.768653" 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-11T00:52:08.767976" elapsed="0.000735"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:08.768814" elapsed="0.000075"/>
</return>
<msg time="2026-04-11T00:52:08.769166" 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-11T00:52:08.765739" elapsed="0.003481"/>
</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-11T00:52:08.769630" elapsed="0.000254"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:08.770615" 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-11T00:52:08.770044" elapsed="0.000598"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:08.771045" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:08.770802" elapsed="0.000270"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:08.771474" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:08.771220" elapsed="0.000280"/>
</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-11T00:52:08.771912" 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-11T00:52:08.772249" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:08.772090" elapsed="0.000232"/>
</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-11T00:52:08.772511" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:08.772350" elapsed="0.000216"/>
</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-11T00:52:08.772728" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:08.772590" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:08.772070" elapsed="0.000732"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:08.771740" elapsed="0.001086"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:08.771553" elapsed="0.001299"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:08.772895" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:08.773094" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:08.773140" 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-11T00:52:08.764104" elapsed="0.009059"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:08.773633" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:08.773709" 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-11T00:52:08.773332" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:08.774320" 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-11T00:52:08.774020" elapsed="0.000426">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:08.773801" elapsed="0.000746">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:08.773784" elapsed="0.000816">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-11T00:52:08.774797" elapsed="0.000025"/>
</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-11T00:52:08.774975" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:08.775039" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:08.758619" elapsed="0.016524">No leader found.</status>
</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-11T00:52:09.783452" 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-11T00:52:09.782818" elapsed="0.000681"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:09.784145" 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-11T00:52:09.783731" elapsed="0.000451"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:09.784249" elapsed="0.000051"/>
</return>
<msg time="2026-04-11T00:52:09.784500" 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-11T00:52:09.782271" elapsed="0.002264"/>
</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-11T00:52:09.784748" elapsed="0.000226"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:09.785688" 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-11T00:52:09.785196" elapsed="0.000530"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:09.786279" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:09.785946" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:09.786870" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:09.786542" elapsed="0.000366"/>
</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-11T00:52:09.787516" 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-11T00:52:09.787869" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:09.787665" elapsed="0.000387"/>
</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-11T00:52:09.788298" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:09.788096" elapsed="0.000279"/>
</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-11T00:52:09.788631" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:09.788431" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:09.787640" elapsed="0.001096"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:09.787247" elapsed="0.001523"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:09.786990" elapsed="0.001816"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:09.788860" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:52:09.789138" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:09.789201" 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-11T00:52:09.781267" elapsed="0.007966"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:09.789869" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:09.789977" 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-11T00:52:09.789492" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:09.790820" 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-11T00:52:09.790431" elapsed="0.000482">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:09.790107" elapsed="0.000895">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:09.790083" elapsed="0.000963">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-11T00:52:09.791256" elapsed="0.000030"/>
</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-11T00:52:09.791547" elapsed="0.000272"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:09.791896" elapsed="0.000023"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:09.776514" elapsed="0.015525">No leader found.</status>
</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-11T00:52:10.802137" 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-11T00:52:10.801204" elapsed="0.000965"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:10.802652" 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-11T00:52:10.802341" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:10.802726" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:52:10.802893" 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-11T00:52:10.800337" elapsed="0.002582"/>
</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-11T00:52:10.803071" elapsed="0.000164"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:10.803741" 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-11T00:52:10.803406" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:10.804164" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:10.803925" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:10.804591" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:10.804336" elapsed="0.000281"/>
</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-11T00:52:10.805028" 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-11T00:52:10.805286" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:10.805138" 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-11T00:52:10.805610" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:10.805367" elapsed="0.000301"/>
</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-11T00:52:10.805834" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:10.805691" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:10.805119" elapsed="0.000789"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:10.804860" elapsed="0.001072"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:10.804670" elapsed="0.001288"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:10.805997" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:52:10.806197" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:10.806242" 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-11T00:52:10.798725" elapsed="0.007541"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:10.806732" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:10.806808" 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-11T00:52:10.806452" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:10.807412" 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-11T00:52:10.807114" elapsed="0.000371">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:10.806900" elapsed="0.000652">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:10.806883" elapsed="0.000700">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-11T00:52:10.807733" 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-11T00:52:10.807905" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:10.807970" elapsed="0.000016"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:10.793130" elapsed="0.014943">No leader found.</status>
</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-11T00:52:11.819000" 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-11T00:52:11.818032" elapsed="0.001034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:11.820167" 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-11T00:52:11.819462" elapsed="0.000766"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:11.820335" elapsed="0.000107"/>
</return>
<msg time="2026-04-11T00:52:11.820734" 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-11T00:52:11.817160" elapsed="0.003630"/>
</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-11T00:52:11.821132" elapsed="0.000392"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:11.822683" 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-11T00:52:11.821882" elapsed="0.000862"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:11.823719" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:11.823099" elapsed="0.000681"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:11.824352" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:11.824111" elapsed="0.000267"/>
</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-11T00:52:11.824803" 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-11T00:52:11.825055" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:11.824910" 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-11T00:52:11.825275" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:11.825136" 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-11T00:52:11.825587" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:11.825440" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:11.824891" elapsed="0.000774"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:11.824637" elapsed="0.001053"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:11.824445" elapsed="0.001271"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:11.825755" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:11.825955" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:11.826001" 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-11T00:52:11.815504" elapsed="0.010520"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:11.826484" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:11.826561" 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-11T00:52:11.826196" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:11.827157" 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-11T00:52:11.826871" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:11.826654" elapsed="0.000638">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:11.826637" 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-11T00:52:11.827491" elapsed="0.000023"/>
</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-11T00:52:11.827680" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:11.827747" elapsed="0.000016"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:11.809213" elapsed="0.018638">No leader found.</status>
</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-11T00:52:12.838017" 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-11T00:52:12.837050" elapsed="0.001053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:12.839152" 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-11T00:52:12.838503" elapsed="0.000709"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:12.839315" elapsed="0.000107"/>
</return>
<msg time="2026-04-11T00:52:12.839708" 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-11T00:52:12.836184" elapsed="0.003579"/>
</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-11T00:52:12.840097" elapsed="0.000392"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:12.842166" 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-11T00:52:12.840852" elapsed="0.001379"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:12.843159" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:12.842621" elapsed="0.000565"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:12.843661" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:12.843335" 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-11T00:52:12.844175" 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-11T00:52:12.844448" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:12.844285" elapsed="0.000229"/>
</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-11T00:52:12.844676" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:12.844539" elapsed="0.000191"/>
</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-11T00:52:12.844891" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:12.844753" elapsed="0.000256"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:12.844265" elapsed="0.000771"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:12.843981" elapsed="0.001080"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:12.843757" elapsed="0.001330"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:12.845127" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:12.845328" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:12.845374" 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-11T00:52:12.834571" elapsed="0.010841"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:12.845855" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:12.845932" 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-11T00:52:12.845581" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:12.846734" 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-11T00:52:12.846452" elapsed="0.000352">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:12.846024" elapsed="0.000845">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:12.846007" elapsed="0.000893">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-11T00:52:12.847049" 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-11T00:52:12.847219" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:12.847283" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:12.828927" elapsed="0.018473">No leader found.</status>
</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-11T00:52:13.856334" 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-11T00:52:13.855690" elapsed="0.000709"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.857130" 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-11T00:52:13.856661" elapsed="0.000508"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:13.857238" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T00:52:13.857498" 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-11T00:52:13.855124" elapsed="0.002410"/>
</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-11T00:52:13.857755" elapsed="0.000244"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.858760" 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-11T00:52:13.858226" elapsed="0.000574"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.859372" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:13.859026" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.859988" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:13.859645" elapsed="0.000381"/>
</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-11T00:52:13.860644" elapsed="0.000036"/>
</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-11T00:52:13.861002" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:13.860797" elapsed="0.000284"/>
</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-11T00:52:13.861311" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:13.861115" elapsed="0.000292"/>
</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-11T00:52:13.861642" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:13.861443" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:13.860771" elapsed="0.000975"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:13.860368" elapsed="0.001410"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.860099" elapsed="0.001806"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:13.861965" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:52:13.862245" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:13.862310" 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-11T00:52:13.854060" elapsed="0.008283"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.862993" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:13.863103" 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-11T00:52:13.862608" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.863967" 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-11T00:52:13.863562" elapsed="0.000525">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:13.863234" elapsed="0.001235">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:13.863210" elapsed="0.001313">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-11T00:52:13.864774" elapsed="0.000032"/>
</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-11T00:52:13.865044" elapsed="0.000037"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.865152" elapsed="0.000020"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:13.848476" elapsed="0.016787">No leader found.</status>
</kw>
<msg time="2026-04-11T00:52:13.865359" level="FAIL">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</msg>
<var>${inv_conf_leader}</var>
<var>${inv_conf_followers_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Get_Leader_And_Followers_For_Shard</arg>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:52:03.674427" elapsed="10.191047">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:13.865698" elapsed="0.000022"/>
</kw>
<return>
<value>${inv_conf_leader}</value>
<value>${inv_conf_followers_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.865763" elapsed="0.000016"/>
</return>
<var>${inventory_leader}</var>
<var>${inventory_followers}</var>
<doc>Check Status for Inventory Config shard in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:52:03.672291" elapsed="10.193572">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${follower_node_1}</var>
<arg>${inventory_followers}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:13.866079" elapsed="0.000024"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${follower_node_2}</var>
<arg>${inventory_followers}</arg>
<arg>1</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:13.866275" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower_node_1}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:13.866492" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower_node_2}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:13.866684" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${inventory_leader}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:13.866872" elapsed="0.000020"/>
</kw>
<doc>Find Followers and Leader in the inventory config shard After Follower Restart.</doc>
<status status="FAIL" start="2026-04-11T00:52:03.660661" elapsed="10.206404">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</status>
</test>
<test id="s1-s3-t13" name="Start Mininet Connect To Leader" line="101">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:13.870537" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:13.870250" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.871980" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:13.871857" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:13.871831" elapsed="0.000244"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.877026" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:13.876915" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:13.876897" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.878098" 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-11T00:52:13.877715" elapsed="0.000458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.878647" 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-11T00:52:13.878335" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:13.878718" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:52:13.878876" 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-11T00:52:13.877322" elapsed="0.001579"/>
</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-11T00:52:13.879246" 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-11T00:52:13.879501" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:13.879343" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:13.879326" elapsed="0.000254"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:13.879105" elapsed="0.000499"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.878954" elapsed="0.000676"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:13.876498" elapsed="0.003184"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:13.871542" elapsed="0.008195"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:13.870970" elapsed="0.008811"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:13.868073" elapsed="0.011759"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<msg time="2026-04-11T00:52:13.884514" level="FAIL">Variable '${inventory_leader}' not found.</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${inventory_leader}_IP}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="FAIL" start="2026-04-11T00:52:13.880131" elapsed="0.004441">Variable '${inventory_leader}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:13.884786" elapsed="0.000024"/>
</kw>
<doc>Start mininet with connection to Leader.</doc>
<status status="FAIL" start="2026-04-11T00:52:13.867511" elapsed="0.017429">Variable '${inventory_leader}' not found.</status>
</test>
<test id="s1-s3-t14" name="Verify Flows In Switch After Follower Restart" line="108">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:13.888337" elapsed="0.000274"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:13.888048" elapsed="0.000620"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.889889" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:13.889747" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:13.889721" elapsed="0.000258"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.894691" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:13.894554" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:13.894531" elapsed="0.000245"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.895895" 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-11T00:52:13.895495" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.896399" 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-11T00:52:13.896090" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:13.896471" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:52:13.896642" 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-11T00:52:13.895066" elapsed="0.001602"/>
</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-11T00:52:13.897041" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:13.897298" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:13.897142" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:13.897125" elapsed="0.000320"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:13.896877" elapsed="0.000592"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.896722" elapsed="0.000772"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:13.894174" elapsed="0.003375"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:13.889361" elapsed="0.008243"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:13.888825" elapsed="0.008823"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:13.885861" elapsed="0.011838"/>
</kw>
<kw name="Verify Sample Flow" owner="ClusterOpenFlow">
<if>
<branch type="IF" condition="'${ODL_OF_PLUGIN}' == 'helium'">
<kw name="Set Test Variable" owner="BuiltIn">
<arg>&amp;{dictionary}</arg>
<arg>10.0.1.0/24=2</arg>
<arg>"output-node-connector":"1"=1</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:13.904170" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:13.903915" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:13.903896" elapsed="0.000363"/>
</if>
<if>
<branch type="IF" condition="'${ODL_OF_PLUGIN}' == 'lithium'">
<kw name="Set Test Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.907813" level="INFO">&amp;{dictionary} = { 10.0.1.0/24=1 | "output-node-connector":"1"=1 }</msg>
<arg>&amp;{dictionary}</arg>
<arg>10.0.1.0/24=1</arg>
<arg>"output-node-connector":"1"=1</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="PASS" start="2026-04-11T00:52:13.904591" elapsed="0.003286"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:13.904314" elapsed="0.003616"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:13.904298" elapsed="0.003667"/>
</if>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.914791" 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-11T00:52:13.914376" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.915280" 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-11T00:52:13.914985" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:13.915352" elapsed="0.000049"/>
</return>
<msg time="2026-04-11T00:52:13.915534" 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-11T00:52:13.913987" elapsed="0.001572"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:13.919976" elapsed="0.000028"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:13.920235" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:13.915738" elapsed="0.004557"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.915615" elapsed="0.004707"/>
</for>
<arg>uri=${operational_table_0}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'10.0.1.0/24': '1', '"output-node-connector":"1"': '1'}.</doc>
<status status="PASS" start="2026-04-11T00:52:13.913379" elapsed="0.007029"/>
</kw>
<arg>15s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${operational_table_0}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:52:13.908193" elapsed="0.012288"/>
</kw>
<doc>Verify sample flow gets applied in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-11T00:52:13.901943" elapsed="0.018639"/>
</kw>
<doc>Verify flows are installed in switch after follower restart.</doc>
<status status="PASS" start="2026-04-11T00:52:13.885249" elapsed="0.035467"/>
</test>
<test id="s1-s3-t15" name="Stop Mininet Connected To Leader and Exit" line="112">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:13.924053" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:13.923784" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.925445" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:13.925302" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:13.925274" elapsed="0.000241"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.930400" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:13.930276" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:13.930258" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.931572" 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-11T00:52:13.931092" elapsed="0.000569"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.932125" 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-11T00:52:13.931827" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:13.932197" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:52:13.932354" 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-11T00:52:13.930695" elapsed="0.001684"/>
</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-11T00:52:13.932769" 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-11T00:52:13.933013" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:13.932869" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:13.932852" elapsed="0.000238"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:13.932625" elapsed="0.000488"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.932449" elapsed="0.000694"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:13.929902" elapsed="0.003307"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:13.924993" elapsed="0.008284"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:13.924489" elapsed="0.008838"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:13.921728" elapsed="0.011680"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<msg time="2026-04-11T00:52:13.941691" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="FAIL" start="2026-04-11T00:52:13.937789" elapsed="0.003949">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<status status="NOT RUN" start="2026-04-11T00:52:13.941954" elapsed="0.000024"/>
</kw>
<doc>Stop mininet Connected To Other Follower and exit connection.</doc>
<status status="FAIL" start="2026-04-11T00:52:13.921093" elapsed="0.021013">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s3-t16" name="Restart Full Cluster" line="117">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:13.945283" elapsed="0.000260"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:13.944958" elapsed="0.000641"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.946592" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:13.946481" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:13.946462" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.951478" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:13.951355" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:13.951336" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.952553" 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-11T00:52:13.952141" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.953023" 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-11T00:52:13.952740" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:13.953092" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:13.953243" 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-11T00:52:13.951769" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:13.953623" 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-11T00:52:13.953860" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:13.953720" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:13.953703" elapsed="0.000286"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:13.953483" elapsed="0.000536"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.953319" elapsed="0.000725"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:13.950991" elapsed="0.003107"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:13.946175" elapsed="0.007977"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:13.945750" elapsed="0.008445"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:13.942892" elapsed="0.011353"/>
</kw>
<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-11T00:52:13.959092" 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-11T00:52:13.958688" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.959617" 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-11T00:52:13.959281" elapsed="0.000371"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:13.959709" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:52:13.959873" 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-11T00:52:13.958296" elapsed="0.001608"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.960977" 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-11T00:52:13.960592" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.961470" 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-11T00:52:13.961164" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:13.961542" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:52:13.961694" 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-11T00:52:13.960161" elapsed="0.001557"/>
</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-11T00:52:13.963230" 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-11T00:52:13.962851" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.963723" 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-11T00:52:13.963433" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:13.963793" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:13.963945" 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-11T00:52:13.962432" elapsed="0.001536"/>
</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-11T00:52:13.964302" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:13.964128" elapsed="0.000235"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.964019" elapsed="0.000385"/>
</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-11T00:52:13.961922" elapsed="0.002549"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.964913" 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-11T00:52:13.964624" elapsed="0.000315"/>
</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-11T00:52:13.965094" elapsed="0.000212"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.965499" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:13.965376" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:13.965359" elapsed="0.000205"/>
</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-11T00:52:13.965852" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:13.965711" elapsed="0.000240"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.965600" elapsed="0.000379"/>
</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-11T00:52:13.969186" 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-11T00:52:13.968804" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.969678" 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-11T00:52:13.969371" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:13.969750" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:13.969903" 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-11T00:52:13.968402" elapsed="0.001534"/>
</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-11T00:52:13.970341" elapsed="0.000030"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:13.970125" elapsed="0.000317"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.969995" elapsed="0.000482"/>
</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-11T00:52:13.966173" elapsed="0.004373"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-11T00:52:13.970598" elapsed="0.000035"/>
</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-11T00:52:13.954585" elapsed="0.016171"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.982424" level="INFO">${base_command} = /tmp/karaf-0.23.1/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-11T00:52:13.982033" elapsed="0.000420"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.982982" level="INFO">${command} = /tmp/karaf-0.23.1/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-11T00:52:13.982622" elapsed="0.000387"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-11T00:52:13.983459" level="INFO">${epoch} = 1775868733.983367</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-11T00:52:13.983172" elapsed="0.000314"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.984046" level="INFO">${gc_filepath} = /tmp/karaf-0.23.1/data/log/gc_1775868733.983367.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-11T00:52:13.983651" elapsed="0.000421"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.984651" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775868733.983367.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-11T00:52:13.984237" elapsed="0.000442"/>
</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-11T00:52:13.986220" 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-11T00:52:13.985828" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.986712" 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-11T00:52:13.986424" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:13.986782" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:13.986933" 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-11T00:52:13.985452" 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-11T00:52:13.987286" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:13.987117" elapsed="0.000232"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.987009" elapsed="0.000392"/>
</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-11T00:52:13.984884" elapsed="0.002580"/>
</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-11T00:52:13.998508" 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-11T00:52:13.998021" elapsed="0.000567"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:13.999100" 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-11T00:52:13.998798" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:13.999172" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:52:13.999327" 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-11T00:52:13.997614" elapsed="0.001738"/>
</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-11T00:52:13.999804" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-11T00:52:13.999939" elapsed="0.000023"/>
</continue>
<status status="NOT RUN" start="2026-04-11T00:52:13.999897" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:13.999880" elapsed="0.000132"/>
</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-11T00:52:14.000171" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:13.999579" elapsed="0.000647"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:13.999420" elapsed="0.000832"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-11T00:52:13.997207" elapsed="0.003098"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:13.996902" elapsed="0.003432"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:13.996883" elapsed="0.003474"/>
</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-11T00:52:14.001854" 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-11T00:52:14.001476" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:14.002325" 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-11T00:52:14.002039" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:14.002411" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:52:14.002566" 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-11T00:52:14.001088" elapsed="0.001503"/>
</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-11T00:52:14.002917" 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-11T00:52:14.006602" elapsed="0.000027"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:14.002755" elapsed="0.003916"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:14.002641" elapsed="0.004058"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-11T00:52:14.000698" elapsed="0.006055"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:14.000438" elapsed="0.006343"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:14.000419" elapsed="0.006385"/>
</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-11T00:52:14.007190" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:14.006859" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:14.006843" elapsed="0.000430"/>
</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-11T00:52:13.996480" elapsed="0.010840"/>
</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-11T00:52:13.987624" elapsed="0.019753"/>
</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-11T00:52:14.011910" 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-11T00:52:14.011534" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:14.012413" 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-11T00:52:14.012095" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:14.012525" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:52:14.012681" 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-11T00:52:14.011114" elapsed="0.001592"/>
</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-11T00:52:14.013030" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:14.012862" elapsed="0.000227"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:14.012756" elapsed="0.000358"/>
</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-11T00:52:14.007662" elapsed="0.005504"/>
</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-11T00:52:13.974831" elapsed="0.038382"/>
</kw>
<doc>Stop all Cluster Nodes and Start it Up All.</doc>
<status status="PASS" start="2026-04-11T00:52:13.942425" elapsed="0.070885"/>
</test>
<test id="s1-s3-t17" name="Get inventory Status After Cluster Restart" line="122">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:14.016439" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:14.016152" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:14.017676" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:14.017565" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:14.017545" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:14.022307" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:14.022201" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:14.022183" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:14.023352" 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-11T00:52:14.022979" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:14.023835" 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-11T00:52:14.023552" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:14.023904" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:14.024056" 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-11T00:52:14.022609" elapsed="0.001472"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:14.024456" 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-11T00:52:14.024697" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:14.024555" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:14.024539" elapsed="0.000232"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:14.024277" elapsed="0.000517"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:14.024131" elapsed="0.000688"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:14.021848" elapsed="0.003022"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:14.017264" elapsed="0.007660"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:14.016849" elapsed="0.008119"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:14.014166" elapsed="0.010853"/>
</kw>
<kw name="Get InventoryConfig Shard Status" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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-11T00:52:14.031814" 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-11T00:52:14.031440" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:14.032282" 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-11T00:52:14.032003" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:14.032425" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:52:14.032580" 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-11T00:52:14.031063" elapsed="0.001541"/>
</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-11T00:52:14.032754" elapsed="0.000166"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:14.033420" 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-11T00:52:14.033076" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:14.033839" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:14.033603" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:14.034249" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:14.034009" elapsed="0.000266"/>
</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-11T00:52:14.034682" 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-11T00:52:14.034923" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:14.034783" elapsed="0.000194"/>
</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-11T00:52:14.035139" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:14.035001" elapsed="0.000191"/>
</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-11T00:52:14.035351" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:14.035214" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:14.034766" elapsed="0.000673"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:14.034520" elapsed="0.000942"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:14.034320" elapsed="0.001166"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:14.035524" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:52:14.035721" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:14.035766" 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-11T00:52:14.030349" elapsed="0.005440"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:14.036226" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:14.036303" 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-11T00:52:14.035955" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:14.036936" 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-11T00:52:14.036658" elapsed="0.000370">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:14.036443" elapsed="0.000651">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:14.036424" elapsed="0.000701">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-11T00:52:14.037274" 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-11T00:52:14.037463" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:14.037529" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:14.028010" elapsed="0.009621">No leader found.</status>
</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-11T00:52:15.048213" 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-11T00:52:15.047354" elapsed="0.000892"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:15.048726" 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-11T00:52:15.048428" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:15.048801" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:52:15.049045" 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-11T00:52:15.046453" elapsed="0.002621"/>
</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-11T00:52:15.049228" elapsed="0.000186"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:15.049916" 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-11T00:52:15.049576" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:15.050340" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:15.050100" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:15.050773" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:15.050531" elapsed="0.000269"/>
</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-11T00:52:15.051222" 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-11T00:52:15.051492" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:15.051330" 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-11T00:52:15.051714" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:15.051573" 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-11T00:52:15.051935" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:15.051793" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:15.051311" elapsed="0.000700"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:15.051050" elapsed="0.000986"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:15.050849" elapsed="0.001215"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:15.052106" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:15.052308" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:15.052355" 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-11T00:52:15.044772" elapsed="0.007607"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:15.052840" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:15.052916" 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-11T00:52:15.052564" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:15.053528" 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-11T00:52:15.053227" elapsed="0.000374">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:15.053009" elapsed="0.000656">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:15.052992" elapsed="0.000706">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-11T00:52:15.053848" 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-11T00:52:15.054017" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:15.054082" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:15.038675" elapsed="0.015511">No leader found.</status>
</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-11T00:52:16.064603" 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-11T00:52:16.063618" elapsed="0.001053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:16.065770" 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-11T00:52:16.065042" elapsed="0.000876"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:16.066032" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:52:16.066442" 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-11T00:52:16.062749" elapsed="0.003751"/>
</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-11T00:52:16.066973" elapsed="0.000252"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:16.068002" 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-11T00:52:16.067413" elapsed="0.000617"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:16.068457" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:16.068191" elapsed="0.000293"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:16.068876" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:16.068634" elapsed="0.000268"/>
</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-11T00:52:16.069324" 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-11T00:52:16.069597" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:16.069451" 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-11T00:52:16.069815" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:16.069677" elapsed="0.000232"/>
</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-11T00:52:16.070086" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:16.069939" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:16.069430" elapsed="0.000731"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:16.069153" elapsed="0.001032"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:16.068954" elapsed="0.001258"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:16.070251" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:52:16.070473" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:16.070519" 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-11T00:52:16.061071" elapsed="0.009474"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:16.070998" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:16.071075" 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-11T00:52:16.070721" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:16.071693" 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-11T00:52:16.071408" elapsed="0.000358">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:16.071168" elapsed="0.000663">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:16.071150" elapsed="0.000712">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-11T00:52:16.072011" 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-11T00:52:16.072185" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:16.072249" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:16.055269" elapsed="0.017082">No leader found.</status>
</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-11T00:52:17.082200" 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-11T00:52:17.081557" elapsed="0.000698"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:17.082949" 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-11T00:52:17.082523" elapsed="0.000466"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:17.083060" elapsed="0.000060"/>
</return>
<msg time="2026-04-11T00:52:17.083316" 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-11T00:52:17.080945" elapsed="0.002412"/>
</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-11T00:52:17.083757" elapsed="0.000253"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:17.084781" 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-11T00:52:17.084238" elapsed="0.000584"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:17.085377" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:17.085044" elapsed="0.000391"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:17.085968" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:17.085642" elapsed="0.000362"/>
</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-11T00:52:17.086610" 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-11T00:52:17.086970" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:17.086763" elapsed="0.000284"/>
</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-11T00:52:17.087274" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:17.087083" elapsed="0.000265"/>
</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-11T00:52:17.087598" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:17.087380" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:17.086737" elapsed="0.000964"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:17.086354" elapsed="0.001381"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:17.086079" elapsed="0.001696"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:17.087830" elapsed="0.000038"/>
</return>
<msg time="2026-04-11T00:52:17.088107" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:17.088172" 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-11T00:52:17.079249" elapsed="0.008955"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:17.088855" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:17.088962" 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-11T00:52:17.088460" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:17.089800" 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-11T00:52:17.089406" elapsed="0.000491">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:17.089089" elapsed="0.000898">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:17.089065" elapsed="0.000966">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-11T00:52:17.090238" 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-11T00:52:17.090497" elapsed="0.000300"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:17.090868" elapsed="0.000022"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:17.073483" elapsed="0.017532">No leader found.</status>
</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-11T00:52:18.099370" 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-11T00:52:18.098756" elapsed="0.000680"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:18.100096" 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-11T00:52:18.099669" elapsed="0.000464"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:18.100199" elapsed="0.000050"/>
</return>
<msg time="2026-04-11T00:52:18.100451" 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-11T00:52:18.098202" elapsed="0.002285"/>
</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-11T00:52:18.100744" elapsed="0.000240"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:18.101797" 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-11T00:52:18.101297" elapsed="0.000537"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:18.102389" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:18.102053" elapsed="0.000392"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:18.102981" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:18.102653" elapsed="0.000364"/>
</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-11T00:52:18.103604" 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-11T00:52:18.103998" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:18.103756" elapsed="0.000323"/>
</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-11T00:52:18.104280" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:18.104117" elapsed="0.000217"/>
</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-11T00:52:18.104514" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:18.104357" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:18.103729" elapsed="0.000862"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:18.103350" elapsed="0.001265"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:18.103088" elapsed="0.001553"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:18.104681" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:18.104881" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:18.104927" 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-11T00:52:18.097170" elapsed="0.007781"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:18.105407" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:18.105488" 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-11T00:52:18.105119" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:18.106074" 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-11T00:52:18.105793" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:18.105580" elapsed="0.000633">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:18.105563" elapsed="0.000681">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-11T00:52:18.106409" 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-11T00:52:18.106583" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:18.106650" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:18.092129" elapsed="0.014627">No leader found.</status>
</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-11T00:52:19.118208" 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-11T00:52:19.117272" elapsed="0.000969"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:19.118730" 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-11T00:52:19.118434" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:19.118806" elapsed="0.000038"/>
</return>
<msg time="2026-04-11T00:52:19.118972" 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-11T00:52:19.116341" elapsed="0.002656"/>
</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-11T00:52:19.119149" elapsed="0.000168"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:19.119826" 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-11T00:52:19.119491" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:19.120336" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:19.120092" elapsed="0.000271"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:19.120779" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:19.120529" 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-11T00:52:19.121233" 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-11T00:52:19.121503" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:19.121341" 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-11T00:52:19.121724" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:19.121585" elapsed="0.000194"/>
</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-11T00:52:19.121943" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:19.121803" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:19.121322" elapsed="0.000697"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:19.121048" elapsed="0.000995"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:19.120858" elapsed="0.001212"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:19.122109" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:52:19.122312" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:19.122358" 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-11T00:52:19.114695" elapsed="0.007690"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:19.122844" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:19.122921" 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-11T00:52:19.122572" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:19.123524" 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-11T00:52:19.123228" elapsed="0.000367">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:19.123014" elapsed="0.000644">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:19.122996" 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-11T00:52:19.123841" 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-11T00:52:19.124013" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:19.124079" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:19.108364" elapsed="0.015818">No leader found.</status>
</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-11T00:52:20.134042" 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-11T00:52:20.133570" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:20.134557" 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-11T00:52:20.134245" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:20.134632" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:52:20.134803" 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-11T00:52:20.132967" elapsed="0.001860"/>
</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-11T00:52:20.134981" elapsed="0.000168"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:20.135658" 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-11T00:52:20.135307" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:20.136078" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:20.135840" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:20.136593" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:20.136328" elapsed="0.000291"/>
</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-11T00:52:20.137053" 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-11T00:52:20.137308" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:20.137161" 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-11T00:52:20.137555" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:20.137391" elapsed="0.000229"/>
</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-11T00:52:20.137794" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:20.137645" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:20.137142" elapsed="0.000725"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:20.136884" elapsed="0.001006"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:20.136672" elapsed="0.001245"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:20.137956" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:20.138157" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:20.138203" 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-11T00:52:20.131263" elapsed="0.006964"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:20.138690" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:20.138766" 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-11T00:52:20.138412" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:20.139354" 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-11T00:52:20.139072" elapsed="0.000375">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:20.138857" elapsed="0.000656">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:20.138840" elapsed="0.000705">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-11T00:52:20.139694" 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-11T00:52:20.139863" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:20.139929" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:20.125279" elapsed="0.014752">No leader found.</status>
</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-11T00:52:21.151928" 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-11T00:52:21.150763" elapsed="0.001247"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:21.152795" 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-11T00:52:21.152453" elapsed="0.000369"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:21.152872" elapsed="0.000049"/>
</return>
<msg time="2026-04-11T00:52:21.153066" 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-11T00:52:21.149825" elapsed="0.003267"/>
</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-11T00:52:21.153247" elapsed="0.000191"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:21.153943" 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-11T00:52:21.153601" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:21.154371" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:21.154127" elapsed="0.000288"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:21.154821" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:21.154563" elapsed="0.000284"/>
</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-11T00:52:21.155360" elapsed="0.000054"/>
</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-11T00:52:21.155660" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:21.155509" elapsed="0.000207"/>
</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-11T00:52:21.155881" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:21.155742" elapsed="0.000194"/>
</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-11T00:52:21.156102" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:21.155961" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:21.155489" elapsed="0.000690"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:21.155190" elapsed="0.001013"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:21.154974" elapsed="0.001257"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:21.156276" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:21.156512" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:21.156568" 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-11T00:52:21.148019" elapsed="0.008573"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:21.157048" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:21.157125" 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-11T00:52:21.156767" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:21.157749" 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-11T00:52:21.157459" elapsed="0.000360">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:21.157220" elapsed="0.000666">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:21.157202" elapsed="0.000716">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-11T00:52:21.158070" 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-11T00:52:21.158245" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:21.158310" elapsed="0.000015"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:21.141278" elapsed="0.017153">No leader found.</status>
</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-11T00:52:22.167423" 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-11T00:52:22.166782" elapsed="0.000687"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:22.168142" 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-11T00:52:22.167709" elapsed="0.000471"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:22.168251" elapsed="0.000052"/>
</return>
<msg time="2026-04-11T00:52:22.168505" 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-11T00:52:22.166237" elapsed="0.002304"/>
</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-11T00:52:22.168756" elapsed="0.000229"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:22.169691" 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-11T00:52:22.169207" elapsed="0.000521"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:22.170279" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:22.169947" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:22.170880" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:22.170547" elapsed="0.000370"/>
</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-11T00:52:22.171501" 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-11T00:52:22.171940" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:22.171736" elapsed="0.000283"/>
</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-11T00:52:22.172285" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:22.172055" elapsed="0.000308"/>
</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-11T00:52:22.172618" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:22.172417" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:22.171710" elapsed="0.001014"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:22.171247" elapsed="0.001510"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:22.170987" elapsed="0.001808"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:22.172850" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:52:22.173129" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:22.173195" 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-11T00:52:22.165206" elapsed="0.008029"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:22.173780" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:22.173857" 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-11T00:52:22.173504" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:22.174494" 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-11T00:52:22.174178" elapsed="0.000387">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:22.173952" elapsed="0.000678">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:22.173934" elapsed="0.000728">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-11T00:52:22.174812" 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-11T00:52:22.174984" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:22.175051" elapsed="0.000014"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:22.159459" elapsed="0.015694">No leader found.</status>
</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-11T00:52:23.184909" 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-11T00:52:23.184180" elapsed="0.000780"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:23.185762" 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-11T00:52:23.185244" elapsed="0.000559"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:23.185878" elapsed="0.000069"/>
</return>
<msg time="2026-04-11T00:52:23.186164" 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-11T00:52:23.183532" elapsed="0.002670"/>
</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-11T00:52:23.186509" elapsed="0.000268"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:23.187589" 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-11T00:52:23.187036" elapsed="0.000601"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:23.188333" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:23.187901" elapsed="0.000465"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:23.188824" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:23.188541" elapsed="0.000313"/>
</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-11T00:52:23.189348" elapsed="0.000027"/>
</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-11T00:52:23.189770" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:23.189586" elapsed="0.000246"/>
</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-11T00:52:23.190028" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:23.189862" elapsed="0.000227"/>
</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-11T00:52:23.190285" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:23.190116" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:23.189561" elapsed="0.000807"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:23.189150" elapsed="0.001265"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:23.188918" elapsed="0.001532"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:23.190498" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:52:23.190726" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:23.190777" 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-11T00:52:23.182331" elapsed="0.008472"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:23.191321" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:23.191426" 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-11T00:52:23.191002" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:23.192156" 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-11T00:52:23.191792" elapsed="0.000458">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:23.191538" elapsed="0.000793">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:23.191517" elapsed="0.000850">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-11T00:52:23.192565" elapsed="0.000025"/>
</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-11T00:52:23.192768" elapsed="0.000023"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:23.192841" elapsed="0.000019"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:23.176192" elapsed="0.016772">No leader found.</status>
</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-11T00:52:24.202091" 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-11T00:52:24.201481" elapsed="0.000654"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.202797" 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-11T00:52:24.202367" elapsed="0.000468"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.202901" elapsed="0.000050"/>
</return>
<msg time="2026-04-11T00:52:24.203157" 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-11T00:52:24.200936" elapsed="0.002256"/>
</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-11T00:52:24.203428" elapsed="0.000228"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.204334" 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-11T00:52:24.203875" elapsed="0.000496"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.204940" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:24.204609" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.205527" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:24.205175" elapsed="0.000390"/>
</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-11T00:52:24.206121" elapsed="0.000032"/>
</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-11T00:52:24.206487" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.206265" elapsed="0.000382"/>
</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-11T00:52:24.206885" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.206685" elapsed="0.000275"/>
</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-11T00:52:24.207243" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.206992" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.206239" elapsed="0.001134"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.205893" elapsed="0.001549"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.205636" elapsed="0.001847"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T00:52:24.207531" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:24.207733" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T00:52:24.207780" 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-11T00:52:24.199921" elapsed="0.007883"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.208252" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:24.208330" 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-11T00:52:24.207973" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.208968" 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-11T00:52:24.208679" elapsed="0.000363">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:24.208457" elapsed="0.000649">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T00:52:24.208437" 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-11T00:52:24.209290" 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-11T00:52:24.209481" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.209549" elapsed="0.000016"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</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-11T00:52:24.194051" elapsed="0.015602">No leader found.</status>
</kw>
<msg time="2026-04-11T00:52:24.209747" level="FAIL">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</msg>
<var>${inv_conf_leader}</var>
<var>${inv_conf_followers_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Get_Leader_And_Followers_For_Shard</arg>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:52:14.027424" elapsed="10.182417">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.210056" elapsed="0.000021"/>
</kw>
<return>
<value>${inv_conf_leader}</value>
<value>${inv_conf_followers_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.210117" elapsed="0.000016"/>
</return>
<var>${inventory_leader}</var>
<var>${inventory_followers}</var>
<doc>Check Status for Inventory Config shard in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T00:52:14.025233" elapsed="10.184985">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${follower_node_1}</var>
<arg>${inventory_followers}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.210421" elapsed="0.000022"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${follower_node_2}</var>
<arg>${inventory_followers}</arg>
<arg>1</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.210612" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower_node_1}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.210812" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${follower_node_2}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.211001" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${inventory_leader}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.211212" elapsed="0.000022"/>
</kw>
<doc>Find New Followers and Leader in the inventory config shard After Cluster Restart.</doc>
<status status="FAIL" start="2026-04-11T00:52:14.013596" elapsed="10.197776">Keyword 'ClusterManagement.Get_Leader_And_Followers_For_Shard' failed after retrying for 10 seconds. The last error was: No leader found.</status>
</test>
<test id="s1-s3-t18" name="Start Mininet Connect To Follower Node2 After Cluster Restart" line="131">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:24.214774" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:24.214509" elapsed="0.000564"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.216155" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.216041" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.216020" 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-11T00:52:24.220897" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.220786" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.220767" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.221984" 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-11T00:52:24.221597" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.222490" 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-11T00:52:24.222173" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.222566" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:52:24.222725" 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-11T00:52:24.221192" elapsed="0.001559"/>
</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-11T00:52:24.223097" 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-11T00:52:24.223436" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.223265" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.223238" elapsed="0.000278"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.222956" elapsed="0.000584"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.222805" elapsed="0.000759"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:24.220398" elapsed="0.003218"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:24.215745" elapsed="0.007925"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:24.215279" elapsed="0.008437"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:24.212335" elapsed="0.011432"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<msg time="2026-04-11T00:52:24.227865" level="FAIL">Variable '${follower_node_2}' not found.</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${follower_node_2}_IP}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.224060" elapsed="0.003844">Variable '${follower_node_2}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.228098" elapsed="0.000021"/>
</kw>
<doc>Start mininet with connection to cluster Follower Node2.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.211748" elapsed="0.016491">Variable '${follower_node_2}' not found.</status>
</test>
<test id="s1-s3-t19" name="Verify Flows In Switch After Cluster Restart" line="138">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:24.232836" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:24.232574" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.234079" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.233970" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.233952" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.238714" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.238608" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.238590" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.239814" 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-11T00:52:24.239432" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.240283" 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-11T00:52:24.239999" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.240353" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:24.240560" 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-11T00:52:24.239005" elapsed="0.001580"/>
</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-11T00:52:24.240921" 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-11T00:52:24.241159" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.241017" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.241001" elapsed="0.000235"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.240783" elapsed="0.000475"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.240635" elapsed="0.000648"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:24.238235" elapsed="0.003101"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:24.233684" elapsed="0.007725"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:24.233248" elapsed="0.008209"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:24.229064" elapsed="0.012444"/>
</kw>
<kw name="Verify Sample Flow" owner="ClusterOpenFlow">
<if>
<branch type="IF" condition="'${ODL_OF_PLUGIN}' == 'helium'">
<kw name="Set Test Variable" owner="BuiltIn">
<arg>&amp;{dictionary}</arg>
<arg>10.0.1.0/24=2</arg>
<arg>"output-node-connector":"1"=1</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.247521" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.247235" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.247218" elapsed="0.000391"/>
</if>
<if>
<branch type="IF" condition="'${ODL_OF_PLUGIN}' == 'lithium'">
<kw name="Set Test Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.250762" level="INFO">&amp;{dictionary} = { 10.0.1.0/24=1 | "output-node-connector":"1"=1 }</msg>
<arg>&amp;{dictionary}</arg>
<arg>10.0.1.0/24=1</arg>
<arg>"output-node-connector":"1"=1</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="PASS" start="2026-04-11T00:52:24.247902" elapsed="0.002906"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.247662" elapsed="0.003186"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.247647" elapsed="0.003225"/>
</if>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.256818" 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-11T00:52:24.256445" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.257283" 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-11T00:52:24.257001" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.257353" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:52:24.257524" 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-11T00:52:24.256042" elapsed="0.001507"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<var>${data}</var>
<arg>uri=${uri}</arg>
<arg>member_index=${index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.261825" elapsed="0.000027"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<arg>${data}</arg>
<arg>${dictionary}</arg>
<doc>Check string for occurrences of items expressed in a list of dictionaries {item=occurrences}. 0 occurences means item is not present.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.262073" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.257712" elapsed="0.004420"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.257599" elapsed="0.004559"/>
</for>
<arg>uri=${operational_table_0}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Send a GET with the supplied uri to all or some members defined in ${member_index_list}.
Then check received for occurrences of items expressed in a dictionary {'10.0.1.0/24': '1', '"output-node-connector":"1"': '1'}.</doc>
<status status="PASS" start="2026-04-11T00:52:24.255487" elapsed="0.006725"/>
</kw>
<arg>15s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${operational_table_0}</arg>
<arg>dictionary=${dictionary}</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-11T00:52:24.251041" elapsed="0.011223"/>
</kw>
<doc>Verify sample flow gets applied in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-11T00:52:24.245401" elapsed="0.016924"/>
</kw>
<doc>Verify flows are installed in switch after cluster restart.</doc>
<status status="PASS" start="2026-04-11T00:52:24.228531" elapsed="0.033911"/>
</test>
<test id="s1-s3-t20" name="Delete Flows In Follower Node1 and Verify After Leader Restart" line="142">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:24.265499" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:24.265216" elapsed="0.000584"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.266766" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.266658" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.266639" 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-11T00:52:24.271375" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.271270" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.271252" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.272492" 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-11T00:52:24.272100" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.272957" 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-11T00:52:24.272676" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.273028" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:24.273177" 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-11T00:52:24.271732" elapsed="0.001470"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.273553" 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-11T00:52:24.273791" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.273649" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.273633" elapsed="0.000232"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.273414" elapsed="0.000474"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.273252" elapsed="0.000660"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:24.270918" elapsed="0.003044"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:24.266359" elapsed="0.007657"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:24.265948" elapsed="0.008111"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:24.263215" elapsed="0.010893"/>
</kw>
<kw name="Delete Sample Flow And Verify" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:52:24.278094" level="FAIL">Variable '${follower_node_1}' not found.</msg>
<arg>${follower_node_1}</arg>
<doc>Delete sample flow in Owner and verify it gets removed from all instances.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.274317" elapsed="0.003814">Variable '${follower_node_1}' not found.</status>
</kw>
<doc>Delete Flow in Follower Node1.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.262692" elapsed="0.015568">Variable '${follower_node_1}' not found.</status>
</test>
<test id="s1-s3-t21" name="Stop Mininet Connected To Follower Node2 and Exit After Cluster Restart" line="146">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:24.281464" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:24.281188" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.282686" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.282580" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.282561" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.287295" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.287189" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.287171" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.288404" 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-11T00:52:24.288016" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.288876" 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-11T00:52:24.288592" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.288947" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:52:24.289096" 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-11T00:52:24.287641" elapsed="0.001479"/>
</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-11T00:52:24.289517" 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-11T00:52:24.289762" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.289614" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.289598" elapsed="0.000240"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.289360" elapsed="0.000501"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.289210" elapsed="0.000676"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:24.286837" elapsed="0.003107"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:24.282281" elapsed="0.007717"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:24.281871" elapsed="0.008171"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:24.278969" elapsed="0.011124"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<msg time="2026-04-11T00:52:24.297760" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="FAIL" start="2026-04-11T00:52:24.293998" elapsed="0.003799">Variable '${mininet_conn_id}' not found.</status>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<status status="NOT RUN" start="2026-04-11T00:52:24.298005" elapsed="0.000024"/>
</kw>
<doc>Stop mininet Connected To Other Follower and exit connection.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.278465" elapsed="0.019676">Variable '${mininet_conn_id}' not found.</status>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-11T00:52:24.298729" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-11T00:52:24.298647" elapsed="0.000144"/>
</kw>
<doc>Test suite for Cluster HA - Data Recovery at Leader Follower failover and cluster restart</doc>
<status status="FAIL" start="2026-04-11T00:51:42.889895" elapsed="41.408929"/>
</suite>
<suite id="s1-s4" name="010 Group Flows" source="/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/010_Group_Flows.robot">
<kw name="Initialization Phase" 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-11T00:52:24.403131" 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-11T00:52:24.399021" elapsed="0.004164"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-11T00:52:24.398800" elapsed="0.004450"/>
</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-11T00:52:24.407963" 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-11T00:52:24.404358" elapsed="0.003634"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-11T00:52:24.408184" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.408074" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.408051" elapsed="0.000199"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.408803" 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-11T00:52:24.408446" elapsed="0.000401"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.409322" 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-11T00:52:24.409011" elapsed="0.000339"/>
</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-11T00:52:24.409879" elapsed="0.000277"/>
</kw>
<msg time="2026-04-11T00:52:24.410254" level="INFO">${status} = PASS</msg>
<msg time="2026-04-11T00:52:24.410301" 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-11T00:52:24.409538" elapsed="0.000788"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.410890" 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-11T00:52:24.410526" elapsed="0.000391"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.411955" 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-11T00:52:24.411691" elapsed="0.000291"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.412410" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:24.412132" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.412886" 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-11T00:52:24.412598" elapsed="0.000315"/>
</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-11T00:52:24.415559" elapsed="0.000072"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.415351" elapsed="0.000331"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.412969" elapsed="0.002742"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.416274" 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-11T00:52:24.415877" elapsed="0.000443"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.416927" 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-11T00:52:24.416527" elapsed="0.000443"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.417533" 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-11T00:52:24.417135" elapsed="0.000442"/>
</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-11T00:52:24.411221" elapsed="0.006415"/>
</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-11T00:52:24.403979" elapsed="0.013711"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.417864" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.417753" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.417735" elapsed="0.000195"/>
</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-11T00:52:24.420952" 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-11T00:52:24.420575" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.421443" 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-11T00:52:24.421141" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.421514" elapsed="0.000035"/>
</return>
<msg time="2026-04-11T00:52:24.421674" 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-11T00:52:24.420203" elapsed="0.001495"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.422032" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.421862" elapsed="0.000229"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.421748" elapsed="0.000369"/>
</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-11T00:52:24.418148" elapsed="0.004021"/>
</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-11T00:52:24.422324" elapsed="0.000226"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.422853" elapsed="0.000020"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.422716" elapsed="0.000200"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.422600" 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-11T00:52:24.403547" elapsed="0.019445"/>
</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-11T00:52:24.425553" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.425444" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.425426" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.430171" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.430066" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.430048" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.431170" 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-11T00:52:24.430799" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.431662" 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-11T00:52:24.431360" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.431767" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:52:24.431924" 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-11T00:52:24.430473" elapsed="0.001476"/>
</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-11T00:52:24.432286" 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-11T00:52:24.432571" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.432381" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.432365" elapsed="0.000284"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.432143" elapsed="0.000529"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.431999" elapsed="0.000697"/>
</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-11T00:52:24.429785" elapsed="0.002963"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-11T00:52:24.423568" elapsed="0.009240"/>
</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-11T00:52:24.423145" elapsed="0.009704"/>
</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-11T00:52:24.398491" elapsed="0.034405"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:24.433307" level="INFO">Creating Session using : alias=session, url=http://:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x79045d15b550&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>session</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-11T00:52:24.433049" elapsed="0.000498"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.434070" level="INFO">${switches} = 3</msg>
<var>${switches}</var>
<arg>${SWITCHES}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:52:24.433760" elapsed="0.000336"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.434595" level="INFO">${iter} = 100</msg>
<var>${iter}</var>
<arg>${ITER}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:52:24.434277" elapsed="0.000344"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.435132" level="INFO">${all_groups} = 600</msg>
<var>${all_groups}</var>
<arg>${switches} * ${iter} * 2</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.434781" elapsed="0.000378"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.435693" level="INFO">${less_groups} = 594</msg>
<var>${less_groups}</var>
<arg>${all_groups} - ${switches} * 2</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.435319" elapsed="0.000401"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.438207" level="INFO">${all_flows} = 303</msg>
<var>${all_flows}</var>
<arg>${switches} * ${iter+1}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.435878" elapsed="0.002357"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.438765" level="INFO">${less_flows} = 300</msg>
<var>${less_flows}</var>
<arg>${all_flows} - ${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.438414" elapsed="0.000378"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.439252" level="INFO">${switches} = 3</msg>
<arg>${switches}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-11T00:52:24.438957" elapsed="0.000337"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.439764" level="INFO">${iter} = 100</msg>
<arg>${iter}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-11T00:52:24.439473" elapsed="0.000332"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.440257" level="INFO">${all_groups} = 600</msg>
<arg>${all_groups}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-11T00:52:24.439963" elapsed="0.000336"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.440805" level="INFO">${less_groups} = 594</msg>
<arg>${less_groups}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-11T00:52:24.440475" elapsed="0.000372"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.441297" level="INFO">${all_flows} = 303</msg>
<arg>${all_flows}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-11T00:52:24.441007" elapsed="0.000335"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.441813" level="INFO">${less_flows} = 300</msg>
<arg>${less_flows}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-11T00:52:24.441519" elapsed="0.000334"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.445896" level="INFO">${no_flows} = 3</msg>
<arg>${no_flows}</arg>
<arg>${SWITCHES}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-11T00:52:24.442011" elapsed="0.003931"/>
</kw>
<doc>Create controller session and set variables.</doc>
<status status="PASS" start="2026-04-11T00:52:24.398168" elapsed="0.047832"/>
</kw>
<test id="s1-s4-t1" name="Add Groups And Flows" line="28">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:24.449064" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:24.448786" elapsed="0.000602"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.450376" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.450267" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.450248" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.455193" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.455087" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.455069" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.456242" 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-11T00:52:24.455872" elapsed="0.000397"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.456757" 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-11T00:52:24.456449" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.456832" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:52:24.456985" 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-11T00:52:24.455499" elapsed="0.001511"/>
</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-11T00:52:24.457349" 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-11T00:52:24.457609" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.457463" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.457446" elapsed="0.000239"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.457205" elapsed="0.000503"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.457061" elapsed="0.000671"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:24.454732" elapsed="0.003051"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:24.449984" elapsed="0.007853"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:24.449559" elapsed="0.008320"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:24.446607" elapsed="0.011323"/>
</kw>
<kw name="Add Groups And Flows On Member">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.459188" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:24.458895" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:24.459260" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:52:24.459424" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:24.458545" elapsed="0.000905"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.463043" level="INFO">&amp;{mapping} = { NODE=openflow:1 }</msg>
<var>&amp;{mapping}</var>
<arg>NODE=openflow:${switch}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.462653" elapsed="0.000418"/>
</kw>
<kw name="Post_As_Json_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.505732" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:24.505336" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T00:52:24.506557" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.506268" elapsed="0.000366">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-11T00:52:24.506731" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T00:52:24.505930" elapsed="0.000826"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.507364" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:52:24.506924" elapsed="0.000483"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-11T00:52:24.507716" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-11T00:52:24.507871" level="INFO">${template} = /rests/data/opendaylight-inventory:nodes/node=$NODE
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-11T00:52:24.507576" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.508306" level="INFO">/rests/data/opendaylight-inventory:nodes/node=$NODE
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:52:24.508058" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.509328" level="INFO">mapping: {'NODE': 'openflow:1'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:52:24.509074" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.509816" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.509557" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.510745" level="INFO">${value} = openflow:1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-11T00:52:24.510189" elapsed="0.000582"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-11T00:52:24.512178" level="INFO">${encoded} = openflow%3A1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.511421" elapsed="0.000800"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-11T00:52:24.512341" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:52:24.512581" level="INFO">${encoded_value} = openflow%3A1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-11T00:52:24.510957" elapsed="0.001649"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.512765" elapsed="0.000778"/>
</kw>
<var name="${key}">NODE</var>
<var name="${value}">openflow:1</var>
<status status="PASS" start="2026-04-11T00:52:24.510054" elapsed="0.003532"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-11T00:52:24.509890" elapsed="0.003733"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-11T00:52:24.513665" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:24.513825" level="INFO">${mapping_to_use} = {'NODE': 'openflow%3A1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-11T00:52:24.508739" elapsed="0.005111"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.508445" elapsed="0.005437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.514059" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.513907" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.508424" elapsed="0.005710"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.515017" level="INFO">${final_text} = /rests/data/opendaylight-inventory:nodes/node=openflow%3A1</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.514279" elapsed="0.000766"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T00:52:24.515093" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="PASS" start="2026-04-11T00:52:24.504629" elapsed="0.010587"/>
</kw>
<msg time="2026-04-11T00:52:24.515273" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T00:52:24.491888" elapsed="0.023434"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.527633" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.539734" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.551911" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.552108" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.552285" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.552677" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.552527" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.552513" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.552901" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.553073" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.553242" elapsed="0.000044"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.552483" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.552362" elapsed="0.000985"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.553519" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.553595" elapsed="0.000016"/>
</return>
<msg time="2026-04-11T00:52:24.553712" level="INFO">${uri} = /rests/data/opendaylight-inventory:nodes/node=openflow%3A1</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one 100 times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-11T00:52:24.487660" elapsed="0.066078"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T00:52:24.564317" elapsed="0.000350"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.577721" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/post_data.prolog.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:24.577301" elapsed="0.000448"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T00:52:24.578477" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/post_data.prolog.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.578245" elapsed="0.000297">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/post_data.prolog.json' does not exist.</status>
</kw>
<msg time="2026-04-11T00:52:24.578634" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T00:52:24.577914" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.579199" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/post_data.prolog.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:52:24.578823" elapsed="0.000404"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-11T00:52:24.579586" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/post_data.prolog.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/post_data.prolog.json&lt;/a&gt;'.</msg>
<msg time="2026-04-11T00:52:24.579719" level="INFO">${template} = {
  "flow-node-inventory:group": [
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-11T00:52:24.579446" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.580149" level="INFO">{
  "flow-node-inventory:group": [
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:52:24.579905" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-11T00:52:24.580564" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.580261" elapsed="0.000362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.581085" level="INFO">${mapping_to_use} = {'NODE': 'openflow:1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:24.580796" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.580648" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.580242" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.581801" level="INFO">${final_text} = {
  "flow-node-inventory:group": [</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.581315" elapsed="0.000514"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T00:52:24.581879" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:52:24.582029" level="INFO">${prolog} = {
  "flow-node-inventory:group": [</msg>
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="PASS" start="2026-04-11T00:52:24.576695" elapsed="0.005359"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.595515" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/post_data.epilog.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:24.595128" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T00:52:24.596244" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/post_data.epilog.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.596038" elapsed="0.000269">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/post_data.epilog.json' does not exist.</status>
</kw>
<msg time="2026-04-11T00:52:24.596415" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T00:52:24.595708" elapsed="0.000733"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.596986" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/post_data.epilog.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:52:24.596608" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-11T00:52:24.597312" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/post_data.epilog.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/post_data.epilog.json&lt;/a&gt;'.</msg>
<msg time="2026-04-11T00:52:24.597459" level="INFO">${template} =   ]
}
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-11T00:52:24.597176" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.597910" level="INFO">  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:52:24.597663" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-11T00:52:24.598308" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.598023" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.598846" level="INFO">${mapping_to_use} = {'NODE': 'openflow:1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:24.598559" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.598408" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.598004" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.599521" level="INFO">${final_text} =   ]
}</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.599077" elapsed="0.000470"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T00:52:24.599645" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:52:24.599800" level="INFO">${epilog} =   ]
}</msg>
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="PASS" start="2026-04-11T00:52:24.594512" elapsed="0.005313"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.612894" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/data.item.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:24.612525" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T00:52:24.613658" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/data.item.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.613432" elapsed="0.000300">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/data.item.json' does not exist.</status>
</kw>
<msg time="2026-04-11T00:52:24.613826" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T00:52:24.613086" elapsed="0.000764"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.614409" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/data.item.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:52:24.614015" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-11T00:52:24.614734" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/data.item.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/data.item.json&lt;/a&gt;'.</msg>
<msg time="2026-04-11T00:52:24.614864" level="INFO">${template} =         {
          "group-id": ${i}000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
       ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-11T00:52:24.614600" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.615299" level="INFO">        {
          "group-id": ${i}000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-${i}",
          "group-type": "group-select"
        }
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:52:24.615057" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-11T00:52:24.615721" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.615435" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.616237" level="INFO">${mapping_to_use} = {'NODE': 'openflow:1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:24.615949" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.615803" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.615415" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.617054" level="INFO">${final_text} =         {
          "group-id": ${i}000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
       ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.616484" elapsed="0.000599"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T00:52:24.617132" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:52:24.617285" level="INFO">${item_template} =         {
          "group-id": ${i}000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
       ...</msg>
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="PASS" start="2026-04-11T00:52:24.611969" elapsed="0.005342"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.617761" level="INFO">${items} = []</msg>
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:52:24.617490" elapsed="0.000300"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.618362" level="INFO">${separator} = ,
</msg>
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:52:24.617995" elapsed="0.000411"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.619018" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.618785" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.618770" elapsed="0.000328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.619606" level="INFO">${j} = 1</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.619241" elapsed="0.000391"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.620373" level="INFO">${item} =         {
          "group-id": 1000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
          ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.619790" elapsed="0.000629"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.620577" elapsed="0.000350"/>
</kw>
<var name="${iteration}">1</var>
<status status="PASS" start="2026-04-11T00:52:24.618740" elapsed="0.002228"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.621400" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.621145" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.621130" elapsed="0.000523"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.622166" level="INFO">${j} = 2</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.621814" elapsed="0.000378"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.622953" level="INFO">${item} =         {
          "group-id": 2000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
          ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.622349" elapsed="0.000633"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.623140" elapsed="0.000183"/>
</kw>
<var name="${iteration}">2</var>
<status status="PASS" start="2026-04-11T00:52:24.621100" elapsed="0.002260"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.623794" elapsed="0.000183"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.623555" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.623541" elapsed="0.000499"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.624553" level="INFO">${j} = 3</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.624185" elapsed="0.000394"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.625310" level="INFO">${item} =         {
          "group-id": 3000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
          ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.624735" elapsed="0.000603"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.625513" elapsed="0.000183"/>
</kw>
<var name="${iteration}">3</var>
<status status="PASS" start="2026-04-11T00:52:24.623511" elapsed="0.002244"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.626180" elapsed="0.000180"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.625935" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.625921" elapsed="0.000520"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.626933" level="INFO">${j} = 4</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.626588" elapsed="0.000372"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.627716" level="INFO">${item} =         {
          "group-id": 4000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
          ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.627116" elapsed="0.000628"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.627899" elapsed="0.000179"/>
</kw>
<var name="${iteration}">4</var>
<status status="PASS" start="2026-04-11T00:52:24.625892" elapsed="0.002223"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.628544" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.628290" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.628276" elapsed="0.000513"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.629277" level="INFO">${j} = 5</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.628933" elapsed="0.000371"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.630130" level="INFO">${item} =         {
          "group-id": 5000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
          ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.629477" elapsed="0.000682"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.630319" elapsed="0.000203"/>
</kw>
<var name="${iteration}">5</var>
<status status="PASS" start="2026-04-11T00:52:24.628247" elapsed="0.002313"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.630980" elapsed="0.000183"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.630741" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.630726" elapsed="0.000501"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.631742" level="INFO">${j} = 6</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.631372" elapsed="0.000396"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.632519" level="INFO">${item} =         {
          "group-id": 6000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
          ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.631927" elapsed="0.000621"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.632706" elapsed="0.000181"/>
</kw>
<var name="${iteration}">6</var>
<status status="PASS" start="2026-04-11T00:52:24.630696" elapsed="0.002229"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.633335" elapsed="0.000202"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.633100" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.633086" elapsed="0.000515"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.634131" level="INFO">${j} = 7</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.633746" elapsed="0.000411"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.634907" level="INFO">${item} =         {
          "group-id": 7000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
          ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.634314" elapsed="0.000621"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.635092" elapsed="0.000189"/>
</kw>
<var name="${iteration}">7</var>
<status status="PASS" start="2026-04-11T00:52:24.633056" elapsed="0.002262"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.635748" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.635511" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.635497" elapsed="0.000495"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.636496" level="INFO">${j} = 8</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.636135" elapsed="0.000388"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.637374" level="INFO">${item} =         {
          "group-id": 8000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
          ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.636680" elapsed="0.000745"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.637585" elapsed="0.000186"/>
</kw>
<var name="${iteration}">8</var>
<status status="PASS" start="2026-04-11T00:52:24.635467" elapsed="0.002356"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.638239" elapsed="0.000200"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.638003" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.637988" elapsed="0.000515"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.638998" level="INFO">${j} = 9</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.638651" elapsed="0.000373"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.639766" level="INFO">${item} =         {
          "group-id": 9000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
          ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.639180" elapsed="0.000614"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.639950" elapsed="0.000180"/>
</kw>
<var name="${iteration}">9</var>
<status status="PASS" start="2026-04-11T00:52:24.637958" elapsed="0.002209"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.640605" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.640347" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.640331" elapsed="0.000552"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.641379" level="INFO">${j} = 10</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.641032" elapsed="0.000396"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.642192" level="INFO">${item} =         {
          "group-id": 10000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.641588" elapsed="0.000632"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.642377" elapsed="0.000203"/>
</kw>
<var name="${iteration}">10</var>
<status status="PASS" start="2026-04-11T00:52:24.640299" elapsed="0.002319"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.643032" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.642796" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.642781" elapsed="0.000496"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.643784" level="INFO">${j} = 11</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.643437" elapsed="0.000373"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.644557" level="INFO">${item} =         {
          "group-id": 11000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.643967" elapsed="0.000619"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.644743" elapsed="0.000180"/>
</kw>
<var name="${iteration}">11</var>
<status status="PASS" start="2026-04-11T00:52:24.642752" elapsed="0.002209"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.645370" elapsed="0.000200"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.645136" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.645122" elapsed="0.000511"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.646170" level="INFO">${j} = 12</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.645779" elapsed="0.000416"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.646945" level="INFO">${item} =         {
          "group-id": 12000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.646352" elapsed="0.000621"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.647128" elapsed="0.000180"/>
</kw>
<var name="${iteration}">12</var>
<status status="PASS" start="2026-04-11T00:52:24.645093" elapsed="0.002252"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.647775" elapsed="0.000180"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.647539" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.647525" elapsed="0.000493"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.648523" level="INFO">${j} = 13</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.648161" elapsed="0.000388"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.649273" level="INFO">${item} =         {
          "group-id": 13000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.648705" elapsed="0.000597"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.649473" elapsed="0.000183"/>
</kw>
<var name="${iteration}">13</var>
<status status="PASS" start="2026-04-11T00:52:24.647495" elapsed="0.002199"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.650138" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.649872" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.649857" elapsed="0.000524"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.650891" level="INFO">${j} = 14</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.650545" elapsed="0.000372"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.651655" level="INFO">${item} =         {
          "group-id": 14000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.651072" elapsed="0.000613"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.651839" elapsed="0.000180"/>
</kw>
<var name="${iteration}">14</var>
<status status="PASS" start="2026-04-11T00:52:24.649826" elapsed="0.002262"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.652525" elapsed="0.000183"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.652269" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.652255" elapsed="0.000517"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.653263" level="INFO">${j} = 15</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.652917" elapsed="0.000373"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.654182" level="INFO">${item} =         {
          "group-id": 15000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.653463" elapsed="0.000749"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.654372" elapsed="0.000200"/>
</kw>
<var name="${iteration}">15</var>
<status status="PASS" start="2026-04-11T00:52:24.652225" elapsed="0.002385"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.655025" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.654788" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.654773" elapsed="0.000497"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.655784" level="INFO">${j} = 16</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.655430" elapsed="0.000380"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.656556" level="INFO">${item} =         {
          "group-id": 16000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.655966" elapsed="0.000619"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.656741" elapsed="0.000181"/>
</kw>
<var name="${iteration}">16</var>
<status status="PASS" start="2026-04-11T00:52:24.654744" elapsed="0.002215"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.657371" elapsed="0.000199"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.657135" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.657121" elapsed="0.000512"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.658146" level="INFO">${j} = 17</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.657777" elapsed="0.000395"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.658924" level="INFO">${item} =         {
          "group-id": 17000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.658328" elapsed="0.000625"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.659106" elapsed="0.000178"/>
</kw>
<var name="${iteration}">17</var>
<status status="PASS" start="2026-04-11T00:52:24.657092" elapsed="0.002230"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.659750" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.659515" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.659501" elapsed="0.000493"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.660498" level="INFO">${j} = 18</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.660139" elapsed="0.000386"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.661247" level="INFO">${item} =         {
          "group-id": 18000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.660680" elapsed="0.000596"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.661450" elapsed="0.000181"/>
</kw>
<var name="${iteration}">18</var>
<status status="PASS" start="2026-04-11T00:52:24.659471" elapsed="0.002198"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.662117" elapsed="0.000184"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.661846" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.661831" elapsed="0.000534"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.662870" level="INFO">${j} = 19</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.662527" elapsed="0.000370"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.663638" level="INFO">${item} =         {
          "group-id": 19000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.663053" elapsed="0.000656"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.663871" elapsed="0.000183"/>
</kw>
<var name="${iteration}">19</var>
<status status="PASS" start="2026-04-11T00:52:24.661802" elapsed="0.002290"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.664524" elapsed="0.000183"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.664269" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.664254" elapsed="0.000516"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.665263" level="INFO">${j} = 20</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.664915" elapsed="0.000374"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.666061" level="INFO">${item} =         {
          "group-id": 20000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.665462" elapsed="0.000627"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.666246" elapsed="0.000207"/>
</kw>
<var name="${iteration}">20</var>
<status status="PASS" start="2026-04-11T00:52:24.664224" elapsed="0.002267"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.666906" elapsed="0.000180"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.666670" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.666656" elapsed="0.000493"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.667658" level="INFO">${j} = 21</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.667292" elapsed="0.000392"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.668428" level="INFO">${item} =         {
          "group-id": 21000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.667841" elapsed="0.000616"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.668613" elapsed="0.000187"/>
</kw>
<var name="${iteration}">21</var>
<status status="PASS" start="2026-04-11T00:52:24.666626" elapsed="0.002210"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.669246" elapsed="0.000198"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.669012" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.668995" elapsed="0.000513"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.669995" level="INFO">${j} = 22</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.669652" elapsed="0.000384"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.670919" level="INFO">${item} =         {
          "group-id": 22000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.670192" elapsed="0.000756"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.671105" elapsed="0.000179"/>
</kw>
<var name="${iteration}">22</var>
<status status="PASS" start="2026-04-11T00:52:24.668966" elapsed="0.002356"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.671752" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.671516" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.671502" elapsed="0.000492"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.672504" level="INFO">${j} = 23</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.672137" elapsed="0.000394"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.673254" level="INFO">${item} =         {
          "group-id": 23000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.672687" elapsed="0.000595"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.673454" elapsed="0.000182"/>
</kw>
<var name="${iteration}">23</var>
<status status="PASS" start="2026-04-11T00:52:24.671472" elapsed="0.002201"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.674110" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.673848" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.673833" elapsed="0.000521"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.674865" level="INFO">${j} = 24</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.674518" elapsed="0.000407"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.675685" level="INFO">${item} =         {
          "group-id": 24000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.675086" elapsed="0.000627"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.675870" elapsed="0.000191"/>
</kw>
<var name="${iteration}">24</var>
<status status="PASS" start="2026-04-11T00:52:24.673804" elapsed="0.002297"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.676529" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.676276" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.676261" elapsed="0.000513"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.677267" level="INFO">${j} = 25</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.676917" elapsed="0.000376"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.678043" level="INFO">${item} =         {
          "group-id": 25000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.677465" elapsed="0.000630"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.678270" elapsed="0.000198"/>
</kw>
<var name="${iteration}">25</var>
<status status="PASS" start="2026-04-11T00:52:24.676231" elapsed="0.002276"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.678920" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.678682" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.678667" elapsed="0.000497"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.679674" level="INFO">${j} = 26</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.679308" elapsed="0.000392"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.680442" level="INFO">${item} =         {
          "group-id": 26000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.679856" elapsed="0.000615"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.680628" elapsed="0.000179"/>
</kw>
<var name="${iteration}">26</var>
<status status="PASS" start="2026-04-11T00:52:24.678638" elapsed="0.002206"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.681251" elapsed="0.000196"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.681019" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.681004" elapsed="0.000507"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.682007" level="INFO">${j} = 27</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.681664" elapsed="0.000370"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.682805" level="INFO">${item} =         {
          "group-id": 27000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.682218" elapsed="0.000615"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.682986" elapsed="0.000180"/>
</kw>
<var name="${iteration}">27</var>
<status status="PASS" start="2026-04-11T00:52:24.680975" elapsed="0.002228"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.683629" elapsed="0.000180"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.683375" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.683361" elapsed="0.000511"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.684360" level="INFO">${j} = 28</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.684017" elapsed="0.000385"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.685131" level="INFO">${item} =         {
          "group-id": 28000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.684559" elapsed="0.000599"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.685312" elapsed="0.000197"/>
</kw>
<var name="${iteration}">28</var>
<status status="PASS" start="2026-04-11T00:52:24.683332" elapsed="0.002215"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.685992" elapsed="0.000211"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.685722" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.685707" elapsed="0.000561"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.686777" level="INFO">${j} = 29</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.686429" elapsed="0.000374"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.687677" level="INFO">${item} =         {
          "group-id": 29000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.686960" elapsed="0.000746"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.687864" elapsed="0.000181"/>
</kw>
<var name="${iteration}">29</var>
<status status="PASS" start="2026-04-11T00:52:24.685677" elapsed="0.002406"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.688512" elapsed="0.000183"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.688257" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.688243" elapsed="0.000516"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.689248" level="INFO">${j} = 30</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.688903" elapsed="0.000371"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.690021" level="INFO">${item} =         {
          "group-id": 30000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.689446" elapsed="0.000603"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.690230" elapsed="0.000199"/>
</kw>
<var name="${iteration}">30</var>
<status status="PASS" start="2026-04-11T00:52:24.688214" elapsed="0.002253"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.690878" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.690641" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.690627" elapsed="0.000495"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.691627" level="INFO">${j} = 31</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.691264" elapsed="0.000388"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.692373" level="INFO">${item} =         {
          "group-id": 31000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.691806" elapsed="0.000611"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.692574" elapsed="0.000180"/>
</kw>
<var name="${iteration}">31</var>
<status status="PASS" start="2026-04-11T00:52:24.690598" elapsed="0.002193"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.693199" elapsed="0.000179"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.692965" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.692950" elapsed="0.000509"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.693943" level="INFO">${j} = 32</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.693602" elapsed="0.000367"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.694756" level="INFO">${item} =         {
          "group-id": 32000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.694125" elapsed="0.000659"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.694937" elapsed="0.000181"/>
</kw>
<var name="${iteration}">32</var>
<status status="PASS" start="2026-04-11T00:52:24.692922" elapsed="0.002234"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.695583" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.695329" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.695314" elapsed="0.000514"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.696321" level="INFO">${j} = 33</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.695971" elapsed="0.000376"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.697086" level="INFO">${item} =         {
          "group-id": 33000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.696518" elapsed="0.000596"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.697303" elapsed="0.000208"/>
</kw>
<var name="${iteration}">33</var>
<status status="PASS" start="2026-04-11T00:52:24.695286" elapsed="0.002263"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.697960" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.697724" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.697710" elapsed="0.000521"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.698748" level="INFO">${j} = 34</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.698385" elapsed="0.000389"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.699519" level="INFO">${item} =         {
          "group-id": 34000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.698930" elapsed="0.000617"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.699703" elapsed="0.000179"/>
</kw>
<var name="${iteration}">34</var>
<status status="PASS" start="2026-04-11T00:52:24.697681" elapsed="0.002238"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.700328" elapsed="0.000198"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.700093" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.700079" elapsed="0.000510"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.701079" level="INFO">${j} = 35</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.700731" elapsed="0.000375"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.701853" level="INFO">${item} =         {
          "group-id": 35000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.701267" elapsed="0.000615"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.702036" elapsed="0.000196"/>
</kw>
<var name="${iteration}">35</var>
<status status="PASS" start="2026-04-11T00:52:24.700050" elapsed="0.002220"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.702702" elapsed="0.000178"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.702467" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.702453" elapsed="0.000490"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.703447" level="INFO">${j} = 36</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.703088" elapsed="0.000385"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.704323" level="INFO">${item} =         {
          "group-id": 36000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.703627" elapsed="0.000725"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.704526" elapsed="0.000180"/>
</kw>
<var name="${iteration}">36</var>
<status status="PASS" start="2026-04-11T00:52:24.702421" elapsed="0.002322"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.705153" elapsed="0.000180"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.704918" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.704903" elapsed="0.000508"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.705899" level="INFO">${j} = 37</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.705555" elapsed="0.000370"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.706703" level="INFO">${item} =         {
          "group-id": 37000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.706080" elapsed="0.000651"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.706886" elapsed="0.000179"/>
</kw>
<var name="${iteration}">37</var>
<status status="PASS" start="2026-04-11T00:52:24.704874" elapsed="0.002228"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.707537" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.707276" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.707262" elapsed="0.000518"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.708268" level="INFO">${j} = 38</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.707924" elapsed="0.000370"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.709079" level="INFO">${item} =         {
          "group-id": 38000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.708505" elapsed="0.000602"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.709263" elapsed="0.000197"/>
</kw>
<var name="${iteration}">38</var>
<status status="PASS" start="2026-04-11T00:52:24.707232" elapsed="0.002266"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.709910" elapsed="0.000180"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.709675" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.709661" elapsed="0.000492"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.710701" level="INFO">${j} = 39</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.710323" elapsed="0.000405"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.711479" level="INFO">${item} =         {
          "group-id": 39000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.710885" elapsed="0.000622"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.711663" elapsed="0.000180"/>
</kw>
<var name="${iteration}">39</var>
<status status="PASS" start="2026-04-11T00:52:24.709632" elapsed="0.002248"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.712290" elapsed="0.000197"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.712056" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.712042" elapsed="0.000509"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.713042" level="INFO">${j} = 40</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.712697" elapsed="0.000371"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.713815" level="INFO">${item} =         {
          "group-id": 40000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.713224" elapsed="0.000619"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.713998" elapsed="0.000179"/>
</kw>
<var name="${iteration}">40</var>
<status status="PASS" start="2026-04-11T00:52:24.712013" elapsed="0.002202"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.714683" elapsed="0.000183"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.714442" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.714426" elapsed="0.000503"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.715436" level="INFO">${j} = 41</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.715075" elapsed="0.000388"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.716194" level="INFO">${item} =         {
          "group-id": 41000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.715620" elapsed="0.000602"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.716377" elapsed="0.000198"/>
</kw>
<var name="${iteration}">41</var>
<status status="PASS" start="2026-04-11T00:52:24.714374" elapsed="0.002239"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.717033" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.716797" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.716783" elapsed="0.000493"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.717782" level="INFO">${j} = 42</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.717437" elapsed="0.000372"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.718559" level="INFO">${item} =         {
          "group-id": 42000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.717964" elapsed="0.000624"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.718742" elapsed="0.000179"/>
</kw>
<var name="${iteration}">42</var>
<status status="PASS" start="2026-04-11T00:52:24.716753" elapsed="0.002205"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.719365" elapsed="0.000197"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.719132" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.719118" elapsed="0.000544"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.720151" level="INFO">${j} = 43</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.719806" elapsed="0.000372"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.721050" level="INFO">${item} =         {
          "group-id": 43000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.720333" elapsed="0.000746"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.721235" elapsed="0.000198"/>
</kw>
<var name="${iteration}">43</var>
<status status="PASS" start="2026-04-11T00:52:24.719089" elapsed="0.002383"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.721883" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.721647" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.721632" elapsed="0.000495"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.722658" level="INFO">${j} = 44</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.722270" elapsed="0.000414"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.723425" level="INFO">${item} =         {
          "group-id": 44000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.722839" elapsed="0.000616"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.723612" elapsed="0.000180"/>
</kw>
<var name="${iteration}">44</var>
<status status="PASS" start="2026-04-11T00:52:24.721603" elapsed="0.002226"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.724237" elapsed="0.000198"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.724003" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.723989" elapsed="0.000509"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.724992" level="INFO">${j} = 45</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.724640" elapsed="0.000378"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.725758" level="INFO">${item} =         {
          "group-id": 45000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.725172" elapsed="0.000614"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.725939" elapsed="0.000180"/>
</kw>
<var name="${iteration}">45</var>
<status status="PASS" start="2026-04-11T00:52:24.723960" elapsed="0.002197"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.726614" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.726336" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.726321" elapsed="0.000551"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.727359" level="INFO">${j} = 46</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.727015" elapsed="0.000386"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.728130" level="INFO">${item} =         {
          "group-id": 46000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.727557" elapsed="0.000602"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.728312" elapsed="0.000197"/>
</kw>
<var name="${iteration}">46</var>
<status status="PASS" start="2026-04-11T00:52:24.726290" elapsed="0.002255"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.728954" elapsed="0.000179"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.728721" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.728707" elapsed="0.000489"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.729701" level="INFO">${j} = 47</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.729339" elapsed="0.000388"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.730499" level="INFO">${item} =         {
          "group-id": 47000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.729881" elapsed="0.000646"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.730683" elapsed="0.000180"/>
</kw>
<var name="${iteration}">47</var>
<status status="PASS" start="2026-04-11T00:52:24.728677" elapsed="0.002258"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.731352" elapsed="0.000200"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.731115" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.731100" elapsed="0.000516"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.732102" level="INFO">${j} = 48</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.731759" elapsed="0.000369"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.732879" level="INFO">${item} =         {
          "group-id": 48000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.732284" elapsed="0.000623"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.733063" elapsed="0.000179"/>
</kw>
<var name="${iteration}">48</var>
<status status="PASS" start="2026-04-11T00:52:24.731070" elapsed="0.002210"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.733713" elapsed="0.000180"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.733476" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.733461" elapsed="0.000496"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.734472" level="INFO">${j} = 49</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.734100" elapsed="0.000399"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.735226" level="INFO">${item} =         {
          "group-id": 49000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.734654" elapsed="0.000600"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.735430" elapsed="0.000182"/>
</kw>
<var name="${iteration}">49</var>
<status status="PASS" start="2026-04-11T00:52:24.733430" elapsed="0.002219"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.736061" elapsed="0.000180"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.735826" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.735812" elapsed="0.000492"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.736807" level="INFO">${j} = 50</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.736463" elapsed="0.000370"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.737710" level="INFO">${item} =         {
          "group-id": 50000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.736992" elapsed="0.000747"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.737895" elapsed="0.000181"/>
</kw>
<var name="${iteration}">50</var>
<status status="PASS" start="2026-04-11T00:52:24.735782" elapsed="0.002332"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.738568" elapsed="0.000184"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.738290" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.738276" elapsed="0.000540"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.739304" level="INFO">${j} = 51</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.738958" elapsed="0.000371"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.740071" level="INFO">${item} =         {
          "group-id": 51000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.739501" elapsed="0.000597"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.740254" elapsed="0.000202"/>
</kw>
<var name="${iteration}">51</var>
<status status="PASS" start="2026-04-11T00:52:24.738247" elapsed="0.002247"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.740905" elapsed="0.000180"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.740670" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.740655" elapsed="0.000493"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.741654" level="INFO">${j} = 52</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.741291" elapsed="0.000389"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.742421" level="INFO">${item} =         {
          "group-id": 52000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.741835" elapsed="0.000672"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.742679" elapsed="0.000184"/>
</kw>
<var name="${iteration}">52</var>
<status status="PASS" start="2026-04-11T00:52:24.740626" elapsed="0.002274"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.743315" elapsed="0.000201"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.743077" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.743062" elapsed="0.000518"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.744070" level="INFO">${j} = 53</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.743724" elapsed="0.000371"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.744841" level="INFO">${item} =         {
          "group-id": 53000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.744250" elapsed="0.000619"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.745024" elapsed="0.000179"/>
</kw>
<var name="${iteration}">53</var>
<status status="PASS" start="2026-04-11T00:52:24.743033" elapsed="0.002207"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.745693" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.745456" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.745440" elapsed="0.000497"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.746442" level="INFO">${j} = 54</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.746082" elapsed="0.000386"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.747232" level="INFO">${item} =         {
          "group-id": 54000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.746650" elapsed="0.000610"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.747431" elapsed="0.000181"/>
</kw>
<var name="${iteration}">54</var>
<status status="PASS" start="2026-04-11T00:52:24.745373" elapsed="0.002277"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.748061" elapsed="0.000180"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.747826" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.747812" elapsed="0.000492"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.748808" level="INFO">${j} = 55</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.748464" elapsed="0.000379"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.749585" level="INFO">${item} =         {
          "group-id": 55000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.748996" elapsed="0.000616"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.749764" elapsed="0.000179"/>
</kw>
<var name="${iteration}">55</var>
<status status="PASS" start="2026-04-11T00:52:24.747783" elapsed="0.002196"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.750407" elapsed="0.000435"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.750157" elapsed="0.000725"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.750141" elapsed="0.000766"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.751423" level="INFO">${j} = 56</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.751053" elapsed="0.000398"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.752179" level="INFO">${item} =         {
          "group-id": 56000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.751606" elapsed="0.000600"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.752360" elapsed="0.000197"/>
</kw>
<var name="${iteration}">56</var>
<status status="PASS" start="2026-04-11T00:52:24.750111" elapsed="0.002483"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.753005" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.752770" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.752756" elapsed="0.000491"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.753754" level="INFO">${j} = 57</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.753407" elapsed="0.000405"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.754718" level="INFO">${item} =         {
          "group-id": 57000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.753974" elapsed="0.000773"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.754905" elapsed="0.000181"/>
</kw>
<var name="${iteration}">57</var>
<status status="PASS" start="2026-04-11T00:52:24.752727" elapsed="0.002395"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.755555" elapsed="0.000183"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.755300" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.755285" elapsed="0.000516"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.756293" level="INFO">${j} = 58</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.755946" elapsed="0.000374"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.757065" level="INFO">${item} =         {
          "group-id": 58000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.756492" elapsed="0.000602"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.757250" elapsed="0.000203"/>
</kw>
<var name="${iteration}">58</var>
<status status="PASS" start="2026-04-11T00:52:24.755256" elapsed="0.002234"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.757906" elapsed="0.000183"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.757668" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.757654" elapsed="0.000497"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.758696" level="INFO">${j} = 59</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.758295" elapsed="0.000428"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.759471" level="INFO">${item} =         {
          "group-id": 59000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.758880" elapsed="0.000620"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.759655" elapsed="0.000179"/>
</kw>
<var name="${iteration}">59</var>
<status status="PASS" start="2026-04-11T00:52:24.757624" elapsed="0.002248"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.760281" elapsed="0.000206"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.760046" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.760032" elapsed="0.000519"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.761037" level="INFO">${j} = 60</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.760694" elapsed="0.000370"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.761810" level="INFO">${item} =         {
          "group-id": 60000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.761218" elapsed="0.000621"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.761993" elapsed="0.000180"/>
</kw>
<var name="${iteration}">60</var>
<status status="PASS" start="2026-04-11T00:52:24.760003" elapsed="0.002206"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.762667" elapsed="0.000187"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.762386" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.762368" elapsed="0.000549"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.763425" level="INFO">${j} = 61</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.763060" elapsed="0.000393"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.764176" level="INFO">${item} =         {
          "group-id": 61000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.763608" elapsed="0.000597"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.764360" elapsed="0.000198"/>
</kw>
<var name="${iteration}">61</var>
<status status="PASS" start="2026-04-11T00:52:24.762339" elapsed="0.002256"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.765037" elapsed="0.000183"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.764768" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.764753" elapsed="0.000531"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.765794" level="INFO">${j} = 62</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.765447" elapsed="0.000374"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.766567" level="INFO">${item} =         {
          "group-id": 62000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.765976" elapsed="0.000620"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.766766" elapsed="0.000180"/>
</kw>
<var name="${iteration}">62</var>
<status status="PASS" start="2026-04-11T00:52:24.764725" elapsed="0.002259"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.767408" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.767158" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.767144" elapsed="0.000520"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.768152" level="INFO">${j} = 63</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.767807" elapsed="0.000371"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.768925" level="INFO">${item} =         {
          "group-id": 63000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.768333" elapsed="0.000620"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.769108" elapsed="0.000178"/>
</kw>
<var name="${iteration}">63</var>
<status status="PASS" start="2026-04-11T00:52:24.767115" elapsed="0.002210"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.769759" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.769524" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.769509" elapsed="0.000495"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.770511" level="INFO">${j} = 64</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.770148" elapsed="0.000390"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.771897" level="INFO">${item} =         {
          "group-id": 64000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.770726" elapsed="0.001200"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.772084" elapsed="0.000181"/>
</kw>
<var name="${iteration}">64</var>
<status status="PASS" start="2026-04-11T00:52:24.769480" elapsed="0.002823"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.772732" elapsed="0.000183"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.772496" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.772481" elapsed="0.000496"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.773499" level="INFO">${j} = 65</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.773121" elapsed="0.000405"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.774255" level="INFO">${item} =         {
          "group-id": 65000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.773683" elapsed="0.000600"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.774457" elapsed="0.000184"/>
</kw>
<var name="${iteration}">65</var>
<status status="PASS" start="2026-04-11T00:52:24.772451" elapsed="0.002248"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.775128" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.774888" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.774873" elapsed="0.000498"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.775880" level="INFO">${j} = 66</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.775532" elapsed="0.000375"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.776651" level="INFO">${item} =         {
          "group-id": 66000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.776061" elapsed="0.000618"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.776870" elapsed="0.000181"/>
</kw>
<var name="${iteration}">66</var>
<status status="PASS" start="2026-04-11T00:52:24.774842" elapsed="0.002246"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.777514" elapsed="0.000183"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.777260" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.777246" elapsed="0.000514"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.778247" level="INFO">${j} = 67</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.777902" elapsed="0.000371"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.779059" level="INFO">${item} =         {
          "group-id": 67000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.778444" elapsed="0.000643"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.779243" elapsed="0.000198"/>
</kw>
<var name="${iteration}">67</var>
<status status="PASS" start="2026-04-11T00:52:24.777216" elapsed="0.002263"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.779889" elapsed="0.000180"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.779653" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.779638" elapsed="0.000494"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.780639" level="INFO">${j} = 68</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.780276" elapsed="0.000390"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.781419" level="INFO">${item} =         {
          "group-id": 68000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.780821" elapsed="0.000627"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.781605" elapsed="0.000180"/>
</kw>
<var name="${iteration}">68</var>
<status status="PASS" start="2026-04-11T00:52:24.779609" elapsed="0.002213"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.782232" elapsed="0.000198"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.781997" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.781983" elapsed="0.000511"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.783007" level="INFO">${j} = 69</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.782639" elapsed="0.000395"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.783784" level="INFO">${item} =         {
          "group-id": 69000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.783189" elapsed="0.000623"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.783969" elapsed="0.000179"/>
</kw>
<var name="${iteration}">69</var>
<status status="PASS" start="2026-04-11T00:52:24.781953" elapsed="0.002232"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.784615" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.784360" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.784345" elapsed="0.000515"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.785350" level="INFO">${j} = 70</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.785004" elapsed="0.000372"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.786123" level="INFO">${item} =         {
          "group-id": 70000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.785549" elapsed="0.000603"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.786307" elapsed="0.000200"/>
</kw>
<var name="${iteration}">70</var>
<status status="PASS" start="2026-04-11T00:52:24.784316" elapsed="0.002228"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.786984" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.786720" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.786706" elapsed="0.000522"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.787734" level="INFO">${j} = 71</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.787371" elapsed="0.000390"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.788681" level="INFO">${item} =         {
          "group-id": 71000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.787961" elapsed="0.000749"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.788867" elapsed="0.000179"/>
</kw>
<var name="${iteration}">71</var>
<status status="PASS" start="2026-04-11T00:52:24.786676" elapsed="0.002408"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.789512" elapsed="0.000184"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.789257" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.789243" elapsed="0.000517"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.790250" level="INFO">${j} = 72</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.789904" elapsed="0.000372"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.791058" level="INFO">${item} =         {
          "group-id": 72000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.790449" elapsed="0.000637"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.791243" elapsed="0.000200"/>
</kw>
<var name="${iteration}">72</var>
<status status="PASS" start="2026-04-11T00:52:24.789213" elapsed="0.002268"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.791893" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.791657" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.791643" elapsed="0.000493"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.792643" level="INFO">${j} = 73</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.792278" elapsed="0.000391"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.793405" level="INFO">${item} =         {
          "group-id": 73000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.792822" elapsed="0.000612"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.793589" elapsed="0.000180"/>
</kw>
<var name="${iteration}">73</var>
<status status="PASS" start="2026-04-11T00:52:24.791613" elapsed="0.002193"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.794218" elapsed="0.000199"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.793983" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.793968" elapsed="0.000513"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.795006" level="INFO">${j} = 74</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.794626" elapsed="0.000406"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.795790" level="INFO">${item} =         {
          "group-id": 74000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.795189" elapsed="0.000629"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.795975" elapsed="0.000182"/>
</kw>
<var name="${iteration}">74</var>
<status status="PASS" start="2026-04-11T00:52:24.793938" elapsed="0.002257"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.796628" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.796373" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.796358" elapsed="0.000516"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.797362" level="INFO">${j} = 75</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.797018" elapsed="0.000386"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.798148" level="INFO">${item} =         {
          "group-id": 75000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.797563" elapsed="0.000612"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.798332" elapsed="0.000201"/>
</kw>
<var name="${iteration}">75</var>
<status status="PASS" start="2026-04-11T00:52:24.796328" elapsed="0.002243"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.799003" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.798746" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.798732" elapsed="0.000556"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.799803" level="INFO">${j} = 76</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.799451" elapsed="0.000378"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.800591" level="INFO">${item} =         {
          "group-id": 76000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.799985" elapsed="0.000635"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.800777" elapsed="0.000181"/>
</kw>
<var name="${iteration}">76</var>
<status status="PASS" start="2026-04-11T00:52:24.798703" elapsed="0.002293"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.801428" elapsed="0.000187"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.801173" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.801158" elapsed="0.000521"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.802174" level="INFO">${j} = 77</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.801826" elapsed="0.000373"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.802978" level="INFO">${item} =         {
          "group-id": 77000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.802355" elapsed="0.000651"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.803163" elapsed="0.000181"/>
</kw>
<var name="${iteration}">77</var>
<status status="PASS" start="2026-04-11T00:52:24.801129" elapsed="0.002252"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.803815" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.803578" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.803564" elapsed="0.000496"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.804689" level="INFO">${j} = 78</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.804204" elapsed="0.000512"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.805473" level="INFO">${item} =         {
          "group-id": 78000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.804874" elapsed="0.000627"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.805660" elapsed="0.000180"/>
</kw>
<var name="${iteration}">78</var>
<status status="PASS" start="2026-04-11T00:52:24.803534" elapsed="0.002343"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.806290" elapsed="0.000209"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.806055" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.806040" elapsed="0.000523"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.807088" level="INFO">${j} = 79</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.806708" elapsed="0.000408"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.807886" level="INFO">${item} =         {
          "group-id": 79000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.807273" elapsed="0.000642"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.808074" elapsed="0.000190"/>
</kw>
<var name="${iteration}">79</var>
<status status="PASS" start="2026-04-11T00:52:24.806011" elapsed="0.002290"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.808733" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.808496" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.808482" elapsed="0.000495"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.809500" level="INFO">${j} = 80</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.809122" elapsed="0.000405"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.810263" level="INFO">${item} =         {
          "group-id": 80000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.809683" elapsed="0.000608"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.810467" elapsed="0.000182"/>
</kw>
<var name="${iteration}">80</var>
<status status="PASS" start="2026-04-11T00:52:24.808451" elapsed="0.002272"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.811190" elapsed="0.000184"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.810939" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.810890" elapsed="0.000566"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.811951" level="INFO">${j} = 81</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.811602" elapsed="0.000375"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.812728" level="INFO">${item} =         {
          "group-id": 81000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.812133" elapsed="0.000624"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.812914" elapsed="0.000179"/>
</kw>
<var name="${iteration}">81</var>
<status status="PASS" start="2026-04-11T00:52:24.810859" elapsed="0.002271"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.813562" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.813307" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.813292" elapsed="0.000515"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.814296" level="INFO">${j} = 82</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.813953" elapsed="0.000370"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.815086" level="INFO">${item} =         {
          "group-id": 82000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.814495" elapsed="0.000619"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.815268" elapsed="0.000197"/>
</kw>
<var name="${iteration}">82</var>
<status status="PASS" start="2026-04-11T00:52:24.813263" elapsed="0.002239"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.815911" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.815677" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.815663" elapsed="0.000492"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.816663" level="INFO">${j} = 83</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.816297" elapsed="0.000393"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.817434" level="INFO">${item} =         {
          "group-id": 83000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.816845" elapsed="0.000618"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.817619" elapsed="0.000180"/>
</kw>
<var name="${iteration}">83</var>
<status status="PASS" start="2026-04-11T00:52:24.815634" elapsed="0.002202"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.818244" elapsed="0.000198"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.818010" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.817996" elapsed="0.000510"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.819024" level="INFO">${j} = 84</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.818651" elapsed="0.000400"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.819801" level="INFO">${item} =         {
          "group-id": 84000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.819204" elapsed="0.000625"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.819983" elapsed="0.000179"/>
</kw>
<var name="${iteration}">84</var>
<status status="PASS" start="2026-04-11T00:52:24.817967" elapsed="0.002231"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.820626" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.820372" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.820357" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.821504" level="INFO">${j} = 85</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.821138" elapsed="0.000393"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.822255" level="INFO">${item} =         {
          "group-id": 85000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.821688" elapsed="0.000628"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.822492" elapsed="0.000183"/>
</kw>
<var name="${iteration}">85</var>
<status status="PASS" start="2026-04-11T00:52:24.820328" elapsed="0.002385"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.823163" elapsed="0.000183"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.822889" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.822875" elapsed="0.000554"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.823921" level="INFO">${j} = 86</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.823576" elapsed="0.000371"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.824691" level="INFO">${item} =         {
          "group-id": 86000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.824102" elapsed="0.000617"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.824874" elapsed="0.000179"/>
</kw>
<var name="${iteration}">86</var>
<status status="PASS" start="2026-04-11T00:52:24.822846" elapsed="0.002244"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.825519" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.825266" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.825251" elapsed="0.000513"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.826251" level="INFO">${j} = 87</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.825906" elapsed="0.000371"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.827062" level="INFO">${item} =         {
          "group-id": 87000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.826450" elapsed="0.000642"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.827254" elapsed="0.000197"/>
</kw>
<var name="${iteration}">87</var>
<status status="PASS" start="2026-04-11T00:52:24.825222" elapsed="0.002267"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.827900" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.827665" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.827651" elapsed="0.000493"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.828660" level="INFO">${j} = 88</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.828288" elapsed="0.000399"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.829426" level="INFO">${item} =         {
          "group-id": 88000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.828840" elapsed="0.000616"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.829609" elapsed="0.000178"/>
</kw>
<var name="${iteration}">88</var>
<status status="PASS" start="2026-04-11T00:52:24.827621" elapsed="0.002204"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.830233" elapsed="0.000198"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.829998" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.829984" elapsed="0.000511"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.830982" level="INFO">${j} = 89</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.830638" elapsed="0.000373"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.831772" level="INFO">${item} =         {
          "group-id": 89000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.831182" elapsed="0.000618"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.831954" elapsed="0.000179"/>
</kw>
<var name="${iteration}">89</var>
<status status="PASS" start="2026-04-11T00:52:24.829955" elapsed="0.002216"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.832600" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.832346" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.832330" elapsed="0.000513"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.833331" level="INFO">${j} = 90</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.832986" elapsed="0.000424"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.834158" level="INFO">${item} =         {
          "group-id": 90000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.833574" elapsed="0.000612"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.834344" elapsed="0.000199"/>
</kw>
<var name="${iteration}">90</var>
<status status="PASS" start="2026-04-11T00:52:24.832301" elapsed="0.002280"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.834994" elapsed="0.000206"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.834759" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.834745" elapsed="0.000519"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.835772" level="INFO">${j} = 91</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.835424" elapsed="0.000375"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.836544" level="INFO">${item} =         {
          "group-id": 91000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.835954" elapsed="0.000619"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.836727" elapsed="0.000179"/>
</kw>
<var name="${iteration}">91</var>
<status status="PASS" start="2026-04-11T00:52:24.834715" elapsed="0.002228"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.837483" elapsed="0.000186"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.837117" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.837103" elapsed="0.000630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.838225" level="INFO">${j} = 92</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.837880" elapsed="0.000372"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.838997" level="INFO">${item} =         {
          "group-id": 92000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.838426" elapsed="0.000600"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.839213" elapsed="0.000204"/>
</kw>
<var name="${iteration}">92</var>
<status status="PASS" start="2026-04-11T00:52:24.837074" elapsed="0.002382"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.839871" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.839633" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.839619" elapsed="0.000496"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.840627" level="INFO">${j} = 93</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.840260" elapsed="0.000393"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.841380" level="INFO">${item} =         {
          "group-id": 93000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.840810" elapsed="0.000615"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.841582" elapsed="0.000179"/>
</kw>
<var name="${iteration}">93</var>
<status status="PASS" start="2026-04-11T00:52:24.839589" elapsed="0.002209"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.842208" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.841972" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.841957" elapsed="0.000511"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.842957" level="INFO">${j} = 94</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.842613" elapsed="0.000369"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.843761" level="INFO">${item} =         {
          "group-id": 94000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.843162" elapsed="0.000627"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.843944" elapsed="0.000180"/>
</kw>
<var name="${iteration}">94</var>
<status status="PASS" start="2026-04-11T00:52:24.841928" elapsed="0.002233"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.844624" elapsed="0.000186"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.844334" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.844320" elapsed="0.000554"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.845368" level="INFO">${j} = 95</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.845020" elapsed="0.000391"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.846140" level="INFO">${item} =         {
          "group-id": 95000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.845570" elapsed="0.000598"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.846324" elapsed="0.000200"/>
</kw>
<var name="${iteration}">95</var>
<status status="PASS" start="2026-04-11T00:52:24.844291" elapsed="0.002270"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.846970" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.846735" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.846721" elapsed="0.000507"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.847736" level="INFO">${j} = 96</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.847374" elapsed="0.000388"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.848508" level="INFO">${item} =         {
          "group-id": 96000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.847918" elapsed="0.000617"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.848691" elapsed="0.000180"/>
</kw>
<var name="${iteration}">96</var>
<status status="PASS" start="2026-04-11T00:52:24.846692" elapsed="0.002216"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.849324" elapsed="0.000200"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.849090" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.849075" elapsed="0.000512"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.850078" level="INFO">${j} = 97</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.849733" elapsed="0.000371"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.850847" level="INFO">${item} =         {
          "group-id": 97000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.850259" elapsed="0.000616"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.851030" elapsed="0.000203"/>
</kw>
<var name="${iteration}">97</var>
<status status="PASS" start="2026-04-11T00:52:24.849046" elapsed="0.002225"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.851701" elapsed="0.000180"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.851465" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.851449" elapsed="0.000495"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.852451" level="INFO">${j} = 98</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.852089" elapsed="0.000388"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.853203" level="INFO">${item} =         {
          "group-id": 98000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.852633" elapsed="0.000597"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.853387" elapsed="0.000193"/>
</kw>
<var name="${iteration}">98</var>
<status status="PASS" start="2026-04-11T00:52:24.851418" elapsed="0.002200"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.854145" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.853901" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.853777" elapsed="0.000628"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.854901" level="INFO">${j} = 99</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.854554" elapsed="0.000374"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.855718" level="INFO">${item} =         {
          "group-id": 99000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
         ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.855085" elapsed="0.000661"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.855939" elapsed="0.000183"/>
</kw>
<var name="${iteration}">99</var>
<status status="PASS" start="2026-04-11T00:52:24.853748" elapsed="0.002411"/>
</iter>
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.856588" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.856334" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.856319" elapsed="0.000512"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.857318" level="INFO">${j} = 100</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.856974" elapsed="0.000370"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.858085" level="INFO">${item} =         {
          "group-id": 100000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
        ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:52:24.857516" elapsed="0.000596"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.858267" elapsed="0.000202"/>
</kw>
<var name="${iteration}">100</var>
<status status="PASS" start="2026-04-11T00:52:24.856290" elapsed="0.002216"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="PASS" start="2026-04-11T00:52:24.618464" elapsed="0.240072"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.859847" level="INFO">${final_text} = {
  "flow-node-inventory:group": [
        {
          "group-id": 1000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
   ...</msg>
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-11T00:52:24.858690" elapsed="0.001186"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T00:52:24.859934" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:52:24.860090" level="INFO">${data} = {
  "flow-node-inventory:group": [
        {
          "group-id": 1000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
   ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one 100 times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-11T00:52:24.563478" elapsed="0.296638"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T00:52:24.861405" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.861134" elapsed="0.000339">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-11T00:52:24.861565" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T00:52:24.860802" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.861904" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.861659" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.862468" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:24.862163" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-11T00:52:24.861984" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.861640" elapsed="0.000910"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.864904" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:52:24.862704" elapsed="0.002227"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-11T00:52:24.864981" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:24.865132" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-11T00:52:24.860474" elapsed="0.004682"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.866671" level="INFO">/rests/data/opendaylight-inventory:nodes/node=openflow%3A1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:52:24.866426" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.867104" level="INFO">{
  "flow-node-inventory:group": [
        {
          "group-id": 1000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-1",
          "group-type": "group-select"
        },
        {
          "group-id": 2000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-2",
          "group-type": "group-select"
        },
        {
          "group-id": 3000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-3",
          "group-type": "group-select"
        },
        {
          "group-id": 4000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-4",
          "group-type": "group-select"
        },
        {
          "group-id": 5000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-5",
          "group-type": "group-select"
        },
        {
          "group-id": 6000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-6",
          "group-type": "group-select"
        },
        {
          "group-id": 7000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-7",
          "group-type": "group-select"
        },
        {
          "group-id": 8000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-8",
          "group-type": "group-select"
        },
        {
          "group-id": 9000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-9",
          "group-type": "group-select"
        },
        {
          "group-id": 10000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-10",
          "group-type": "group-select"
        },
        {
          "group-id": 11000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-11",
          "group-type": "group-select"
        },
        {
          "group-id": 12000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-12",
          "group-type": "group-select"
        },
        {
          "group-id": 13000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-13",
          "group-type": "group-select"
        },
        {
          "group-id": 14000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-14",
          "group-type": "group-select"
        },
        {
          "group-id": 15000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-15",
          "group-type": "group-select"
        },
        {
          "group-id": 16000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-16",
          "group-type": "group-select"
        },
        {
          "group-id": 17000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-17",
          "group-type": "group-select"
        },
        {
          "group-id": 18000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-18",
          "group-type": "group-select"
        },
        {
          "group-id": 19000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-19",
          "group-type": "group-select"
        },
        {
          "group-id": 20000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-20",
          "group-type": "group-select"
        },
        {
          "group-id": 21000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-21",
          "group-type": "group-select"
        },
        {
          "group-id": 22000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-22",
          "group-type": "group-select"
        },
        {
          "group-id": 23000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-23",
          "group-type": "group-select"
        },
        {
          "group-id": 24000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-24",
          "group-type": "group-select"
        },
        {
          "group-id": 25000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-25",
          "group-type": "group-select"
        },
        {
          "group-id": 26000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-26",
          "group-type": "group-select"
        },
        {
          "group-id": 27000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-27",
          "group-type": "group-select"
        },
        {
          "group-id": 28000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-28",
          "group-type": "group-select"
        },
        {
          "group-id": 29000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-29",
          "group-type": "group-select"
        },
        {
          "group-id": 30000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-30",
          "group-type": "group-select"
        },
        {
          "group-id": 31000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-31",
          "group-type": "group-select"
        },
        {
          "group-id": 32000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-32",
          "group-type": "group-select"
        },
        {
          "group-id": 33000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-33",
          "group-type": "group-select"
        },
        {
          "group-id": 34000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-34",
          "group-type": "group-select"
        },
        {
          "group-id": 35000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-35",
          "group-type": "group-select"
        },
        {
          "group-id": 36000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-36",
          "group-type": "group-select"
        },
        {
          "group-id": 37000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-37",
          "group-type": "group-select"
        },
        {
          "group-id": 38000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-38",
          "group-type": "group-select"
        },
        {
          "group-id": 39000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-39",
          "group-type": "group-select"
        },
        {
          "group-id": 40000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-40",
          "group-type": "group-select"
        },
        {
          "group-id": 41000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-41",
          "group-type": "group-select"
        },
        {
          "group-id": 42000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-42",
          "group-type": "group-select"
        },
        {
          "group-id": 43000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-43",
          "group-type": "group-select"
        },
        {
          "group-id": 44000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-44",
          "group-type": "group-select"
        },
        {
          "group-id": 45000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-45",
          "group-type": "group-select"
        },
        {
          "group-id": 46000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-46",
          "group-type": "group-select"
        },
        {
          "group-id": 47000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-47",
          "group-type": "group-select"
        },
        {
          "group-id": 48000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-48",
          "group-type": "group-select"
        },
        {
          "group-id": 49000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-49",
          "group-type": "group-select"
        },
        {
          "group-id": 50000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-50",
          "group-type": "group-select"
        },
        {
          "group-id": 51000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-51",
          "group-type": "group-select"
        },
        {
          "group-id": 52000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-52",
          "group-type": "group-select"
        },
        {
          "group-id": 53000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-53",
          "group-type": "group-select"
        },
        {
          "group-id": 54000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-54",
          "group-type": "group-select"
        },
        {
          "group-id": 55000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-55",
          "group-type": "group-select"
        },
        {
          "group-id": 56000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-56",
          "group-type": "group-select"
        },
        {
          "group-id": 57000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-57",
          "group-type": "group-select"
        },
        {
          "group-id": 58000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-58",
          "group-type": "group-select"
        },
        {
          "group-id": 59000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-59",
          "group-type": "group-select"
        },
        {
          "group-id": 60000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-60",
          "group-type": "group-select"
        },
        {
          "group-id": 61000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-61",
          "group-type": "group-select"
        },
        {
          "group-id": 62000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-62",
          "group-type": "group-select"
        },
        {
          "group-id": 63000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-63",
          "group-type": "group-select"
        },
        {
          "group-id": 64000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-64",
          "group-type": "group-select"
        },
        {
          "group-id": 65000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-65",
          "group-type": "group-select"
        },
        {
          "group-id": 66000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-66",
          "group-type": "group-select"
        },
        {
          "group-id": 67000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-67",
          "group-type": "group-select"
        },
        {
          "group-id": 68000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-68",
          "group-type": "group-select"
        },
        {
          "group-id": 69000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-69",
          "group-type": "group-select"
        },
        {
          "group-id": 70000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-70",
          "group-type": "group-select"
        },
        {
          "group-id": 71000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-71",
          "group-type": "group-select"
        },
        {
          "group-id": 72000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-72",
          "group-type": "group-select"
        },
        {
          "group-id": 73000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-73",
          "group-type": "group-select"
        },
        {
          "group-id": 74000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-74",
          "group-type": "group-select"
        },
        {
          "group-id": 75000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-75",
          "group-type": "group-select"
        },
        {
          "group-id": 76000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-76",
          "group-type": "group-select"
        },
        {
          "group-id": 77000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-77",
          "group-type": "group-select"
        },
        {
          "group-id": 78000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-78",
          "group-type": "group-select"
        },
        {
          "group-id": 79000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-79",
          "group-type": "group-select"
        },
        {
          "group-id": 80000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-80",
          "group-type": "group-select"
        },
        {
          "group-id": 81000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-81",
          "group-type": "group-select"
        },
        {
          "group-id": 82000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-82",
          "group-type": "group-select"
        },
        {
          "group-id": 83000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-83",
          "group-type": "group-select"
        },
        {
          "group-id": 84000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-84",
          "group-type": "group-select"
        },
        {
          "group-id": 85000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-85",
          "group-type": "group-select"
        },
        {
          "group-id": 86000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-86",
          "group-type": "group-select"
        },
        {
          "group-id": 87000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-87",
          "group-type": "group-select"
        },
        {
          "group-id": 88000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-88",
          "group-type": "group-select"
        },
        {
          "group-id": 89000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-89",
          "group-type": "group-select"
        },
        {
          "group-id": 90000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-90",
          "group-type": "group-select"
        },
        {
          "group-id": 91000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-91",
          "group-type": "group-select"
        },
        {
          "group-id": 92000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-92",
          "group-type": "group-select"
        },
        {
          "group-id": 93000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-93",
          "group-type": "group-select"
        },
        {
          "group-id": 94000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-94",
          "group-type": "group-select"
        },
        {
          "group-id": 95000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-95",
          "group-type": "group-select"
        },
        {
          "group-id": 96000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-96",
          "group-type": "group-select"
        },
        {
          "group-id": 97000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-97",
          "group-type": "group-select"
        },
        {
          "group-id": 98000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-98",
          "group-type": "group-select"
        },
        {
          "group-id": 99000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-99",
          "group-type": "group-select"
        },
        {
          "group-id": 100000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-100",
          "group-type": "group-select"
        }
  ]
}</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:52:24.866869" elapsed="0.000778"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.868052" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:52:24.867805" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.868503" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:52:24.868248" elapsed="0.000299"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-11T00:52:24.869362" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-11T00:52:24.869149" elapsed="0.000257"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-11T00:52:24.869738" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-11T00:52:24.869565" elapsed="0.000200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.869917" elapsed="0.000187"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.870529" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:52:24.870260" elapsed="0.000314"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-11T00:52:24.870616" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:52:24.870770" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-11T00:52:24.868745" elapsed="0.002049"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:24.873416" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.873108" elapsed="0.000906">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:52:24.871017" elapsed="0.003084">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.874286" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.874133" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-11T00:52:24.870846" elapsed="0.003531">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.874755" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.874887" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.874851" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.874834" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.875090" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.875156" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.865495" elapsed="0.009765">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.875362" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=json</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.476876" elapsed="0.398600">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.875766" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.875589" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.875572" elapsed="0.000283"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.875887" elapsed="0.000014"/>
</return>
<arg>folder=${VAR_DIR}/add-group-1</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>iterations=${iter}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.474277" elapsed="0.401703">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Post_As_Json_Templated" owner="TemplatedRequests">
<arg>folder=${VAR_DIR}/add-group-2</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>iterations=${iter}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.887133" elapsed="0.000028"/>
</kw>
<kw name="Post_As_Json_Templated" owner="TemplatedRequests">
<arg>folder=${VAR_DIR}/add-flow</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>iterations=${iter}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.898243" elapsed="0.000027"/>
</kw>
<var name="${switch}">1</var>
<status status="FAIL" start="2026-04-11T00:52:24.462507" elapsed="0.435826">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="FAIL" start="2026-04-11T00:52:24.459499" elapsed="0.438907">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</for>
<arg>${ITER}</arg>
<doc>Add 100 groups type 1 &amp; 2 and flows in every switch.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.458147" elapsed="0.440357">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Add 100 groups 1&amp;2 and flows in every switch.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.446094" elapsed="0.452559">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t2" name="Start Mininet Multiple Connections" line="32">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:24.901946" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:24.901686" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.903189" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.903081" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.903062" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.908184" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.908080" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.908061" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.909249" 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-11T00:52:24.908876" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.909736" 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-11T00:52:24.909454" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.909813" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:24.909962" 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-11T00:52:24.908502" elapsed="0.001484"/>
</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-11T00:52:24.910325" 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-11T00:52:24.910585" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.910438" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.910421" elapsed="0.000241"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.910184" elapsed="0.000501"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.910037" elapsed="0.000672"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:24.907723" elapsed="0.003038"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:24.902801" elapsed="0.008014"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:24.902363" elapsed="0.008496"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:24.899591" elapsed="0.011319"/>
</kw>
<kw name="List_All_Indices" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.914228" 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-11T00:52:24.913851" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.914771" 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-11T00:52:24.914472" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.914843" elapsed="0.000028"/>
</return>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:52:24.911791" elapsed="0.003176"/>
</kw>
<msg time="2026-04-11T00:52:24.915006" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>List_Indices_Or_All</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T00:52:24.911382" elapsed="0.003669"/>
</kw>
<msg time="2026-04-11T00:52:24.915148" level="INFO">${cluster_index_list} = []</msg>
<var>${cluster_index_list}</var>
<doc>Create a new list of all indices.</doc>
<status status="PASS" start="2026-04-11T00:52:24.911109" elapsed="0.004063"/>
</kw>
<kw name="Start Mininet Multiple Controllers" owner="MininetKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.922688" 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-11T00:52:24.922303" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.923153" 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-11T00:52:24.922875" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.923223" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:52:24.923373" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:52:24.921932" elapsed="0.001482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.923826" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:52:24.923614" elapsed="0.000255"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.926453" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.926164" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.926146" elapsed="0.000389"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-11T00:52:24.926880" 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-11T00:52:24.926985" level="INFO">${current_ssh_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-11T00:52:24.926688" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.927562" level="INFO">Attempting to execute command "sudo mn -c" on remote system "" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:52:24.927167" elapsed="0.000458"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-11T00:52:24.928159" level="INFO">${conn_id} = 5</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.927786" elapsed="0.000398"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.929086" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T00:52:24.929161" 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-11T00:52:24.928823" elapsed="0.000362"/>
</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-11T00:52:24.929346" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-11T00:52:24.930545" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-11T00:52:24.930800" 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-11T00:52:24.930209" elapsed="0.001025">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-11T00:52:24.931290" 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-11T00:52:24.929849" elapsed="0.001490"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.928418" elapsed="0.003041">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.931666" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.931894" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.932079" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.932202" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.932164" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.932146" elapsed="0.000119"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.932349" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.932315" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.932300" elapsed="0.000128"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.932459" elapsed="0.000014"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T00:52:24.935050" elapsed="0.000302"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-11T00:52:24.935534" elapsed="0.000171"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-11T00:52:24.935860" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-11T00:52:24.932781" elapsed="0.003232"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.925643" elapsed="0.010446">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-11T00:52:24.936144" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.924909" elapsed="0.011280"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.924429" elapsed="0.011855">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.936481" elapsed="0.000025"/>
</kw>
<arg>${mininet}</arg>
<status status="FAIL" start="2026-04-11T00:52:24.924067" elapsed="0.012526">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.940904" elapsed="0.000026"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.941128" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.941382" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.941213" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.941195" elapsed="0.000281"/>
</if>
<if>
<branch type="IF" condition="'${protocol}' == 'ssl'">
<kw name="Install Certificates In Mininet" owner="MininetKeywords">
<doc>Copy and install certificates in simulator.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.941730" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.941529" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.941514" elapsed="0.000291"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>Start mininet ${options}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.941961" elapsed="0.000021"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>sudo mn ${options}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.942128" elapsed="0.000020"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.942292" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Create controller configuration</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.942489" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${controller_opt}</var>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.942675" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<var>${controller_opt}</var>
<arg>${controller_opt}</arg>
<arg>${SPACE}${protocol}:${ODL_SYSTEM_${index}_IP}:${ofport}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.942941" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${controller_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.943126" elapsed="0.000019"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.942796" elapsed="0.000379"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.942740" elapsed="0.000460"/>
</for>
<kw name="Log" owner="BuiltIn">
<arg>Open extra SSH connection to configure the OVS bridges</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.943358" elapsed="0.000020"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.947541" elapsed="0.000026"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${num_bridges}</var>
<arg>sudo ovs-vsctl show | grep Bridge | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.947794" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${num_bridges}</var>
<arg>${num_bridges}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.947994" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${bridges}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.948180" elapsed="0.000019"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<var>${bridge}</var>
<arg>sudo ovs-vsctl show | grep Bridge | cut -c 12- | sort | head -${i} | tail -1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.948456" elapsed="0.000021"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo ovs-vsctl del-controller ${bridge} &amp;&amp; sudo ovs-vsctl set bridge ${bridge} protocols=OpenFlow${ofversion}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.948629" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${bridges}</arg>
<arg>${bridge}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.948792" elapsed="0.000020"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.948305" elapsed="0.000540"/>
</iter>
<var>${i}</var>
<value>1</value>
<value>${num_bridges+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.948244" elapsed="0.000626"/>
</for>
<kw name="Log" owner="BuiltIn">
<arg>Configure OVS controllers ${controller_opt} in all bridges</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.949035" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo ovs-vsctl set-controller ${bridge} ${controller_opt}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.949279" elapsed="0.000020"/>
</kw>
<var name="${bridge}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.949146" elapsed="0.000184"/>
</iter>
<var>${bridge}</var>
<value>@{bridges}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.949099" elapsed="0.000257"/>
</for>
<kw name="Log" owner="BuiltIn">
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.949542" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${output}</var>
<arg>sudo ovs-vsctl show</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.949713" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.949896" elapsed="0.000019"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.950059" elapsed="0.000020"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.950114" elapsed="0.000015"/>
</return>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${cluster_index_list}</arg>
<arg>--topo linear,${SWITCHES}</arg>
<doc>Start Mininet with custom topology and connect to list of controllers in ${controller_index_list} or all if no list is provided.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.919492" elapsed="0.030719">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${cluster_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.950401" elapsed="0.000026"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.950585" elapsed="0.000020"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>OVSDB.Check OVS OpenFlow Connections</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${SWITCHES*3}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.950761" elapsed="0.000019"/>
</kw>
<doc>Start mininet linear with connection to all cluster instances.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.899002" elapsed="0.051908">OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t3" name="Check Linear Topology" line="48">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:24.954053" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:24.953794" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.955280" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.955173" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.955154" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.960243" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:24.960138" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:24.960120" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.961301" 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-11T00:52:24.960928" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.961790" 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-11T00:52:24.961505" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:24.961859" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:52:24.962010" 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-11T00:52:24.960549" elapsed="0.001485"/>
</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-11T00:52:24.962440" 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-11T00:52:24.962686" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.962537" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.962520" elapsed="0.000241"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.962273" elapsed="0.000511"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.962125" elapsed="0.000683"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:24.959769" elapsed="0.003091"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:24.954893" elapsed="0.008020"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:24.954479" elapsed="0.008478"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:24.951666" elapsed="0.011341"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:24.964894" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:24.964603" elapsed="0.000318"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:24.964966" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:24.965111" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:24.964246" elapsed="0.000889"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:24.965562" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.965303" elapsed="0.000566">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.966065" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.966484" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.966675" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.966858" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.967040" elapsed="0.000019"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.967222" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.967424" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.967672" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.967511" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.967493" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.967984" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.967802" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.967787" elapsed="0.000277"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:24.968273" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:24.968114" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:24.968100" elapsed="0.000248"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:24.966311" elapsed="0.002059"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:24.966136" elapsed="0.002277"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.963873" elapsed="0.004635">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:25.972535" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:25.971764" elapsed="0.000842"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:25.972850" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:52:25.973213" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:25.970935" elapsed="0.002335"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:25.974743" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:25.973701" elapsed="0.001830">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:25.975994" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:25.976921" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:25.977342" elapsed="0.000075"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:25.977847" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:25.978261" elapsed="0.000043"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:25.978630" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:25.978888" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:25.979239" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:25.979012" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:25.978986" elapsed="0.000362"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:25.979667" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:25.979443" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:25.979420" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:25.980071" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:25.979849" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:25.979828" elapsed="0.000351"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:25.976576" elapsed="0.003635"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:25.976154" elapsed="0.004093"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:25.969839" elapsed="0.010537">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:26.984358" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:26.983620" elapsed="0.000843"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:26.984581" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:52:26.984936" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:26.982794" elapsed="0.002204"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:26.985931" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:26.985345" elapsed="0.001448">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:26.987254" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:26.988186" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:26.988641" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:26.989060" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:26.989507" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:26.989916" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:26.990329" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:26.991110" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:26.990738" elapsed="0.000497"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:26.990693" elapsed="0.000597"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:26.991612" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:26.991443" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:26.991376" elapsed="0.000316"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:26.991905" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:26.991745" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:26.991729" elapsed="0.000253"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:26.987842" elapsed="0.004164"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:26.987447" elapsed="0.004585"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:26.981699" elapsed="0.010429">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:27.996049" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:27.995275" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:27.996235" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:52:27.996624" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:27.994447" elapsed="0.002234"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:27.997608" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:27.997032" elapsed="0.001318">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:27.998883" elapsed="0.000056"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:28.001258" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:28.001564" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:28.001829" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:28.002089" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:28.002350" elapsed="0.000034"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:28.002638" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:28.003016" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:28.002763" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:28.002737" elapsed="0.000391"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:28.003446" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:28.003203" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:28.003181" elapsed="0.000375"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:28.003855" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:28.003630" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:28.003608" elapsed="0.000355"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:28.001028" elapsed="0.002967"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:27.999053" elapsed="0.004978"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:27.993423" elapsed="0.010741">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:29.008097" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:29.007334" elapsed="0.000831"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:29.008279" elapsed="0.000075"/>
</return>
<msg time="2026-04-11T00:52:29.008654" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:29.006497" elapsed="0.002212"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:29.009746" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:29.009176" elapsed="0.001333">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:29.011022" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:29.011784" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:29.012066" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:29.012340" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:29.012643" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:29.012916" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:29.013190" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:29.013588" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:29.013324" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:29.013297" elapsed="0.000409"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:29.014020" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:29.013785" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:29.013762" elapsed="0.000373"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:29.014468" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:29.014211" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:29.014188" elapsed="0.000395"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:29.011552" elapsed="0.003064"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:29.011181" elapsed="0.003472"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:29.005453" elapsed="0.009353">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:30.020269" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:30.019647" elapsed="0.000681"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:30.020460" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:52:30.020738" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:30.017864" elapsed="0.002909"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:30.021430" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:30.021002" elapsed="0.001153">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:30.022544" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:30.023173" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:30.023470" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:30.023729" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:30.023986" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:30.024246" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:30.024535" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:30.024918" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:30.024683" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:30.024649" elapsed="0.000538"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:30.025518" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:30.025271" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:30.025249" elapsed="0.000380"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:30.025922" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:30.025700" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:30.025680" elapsed="0.000348"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:30.022939" elapsed="0.003120"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:30.022666" elapsed="0.003436"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:30.016494" elapsed="0.009759">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:31.033517" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:31.032559" elapsed="0.001041"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:31.033739" elapsed="0.000102"/>
</return>
<msg time="2026-04-11T00:52:31.034134" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:31.031180" elapsed="0.003009"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:31.035183" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:31.034587" elapsed="0.001476">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:31.036678" elapsed="0.000059"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:31.037761" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:31.038193" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:31.038639" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:31.039053" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:31.039492" elapsed="0.000050"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:31.039921" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:31.040537" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:31.040137" elapsed="0.000524"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:31.040089" elapsed="0.000630"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:31.041195" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:31.040837" elapsed="0.000480"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:31.040804" elapsed="0.000567"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:31.041939" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:31.041574" elapsed="0.000485"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:31.041535" elapsed="0.000580"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:31.037349" elapsed="0.004815"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:31.036876" elapsed="0.005350"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:31.028644" elapsed="0.013834">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:32.046849" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:32.046068" elapsed="0.000850"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:32.047058" elapsed="0.000097"/>
</return>
<msg time="2026-04-11T00:52:32.047480" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:32.045046" elapsed="0.002493"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:32.048528" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:32.047894" elapsed="0.001146">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:32.049625" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:32.050199" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:32.050576" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:32.050842" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:32.051102" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:32.051360" elapsed="0.000048"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:32.051646" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:32.052008" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:32.051772" elapsed="0.000357"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:32.051747" elapsed="0.000417"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:32.052650" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:32.052293" elapsed="0.000444"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:32.052268" elapsed="0.000503"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:32.053076" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:32.052847" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:32.052824" elapsed="0.000360"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:32.049979" elapsed="0.003237"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:32.049731" elapsed="0.003521"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:32.043876" elapsed="0.009531">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:33.058205" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:33.057376" elapsed="0.000924"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:33.058459" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:52:33.058893" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:33.056508" elapsed="0.002447"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:33.059933" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:33.059335" elapsed="0.001422">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:33.061224" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:33.062328" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:33.062838" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:33.063257" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:33.063663" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:33.064022" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:33.064278" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:33.064659" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:33.064426" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:33.064379" elapsed="0.000390"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:33.065065" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:33.064844" elapsed="0.000396"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:33.064822" elapsed="0.000458"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:33.065599" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:33.065355" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:33.065333" elapsed="0.000375"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:33.061972" elapsed="0.003768"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:33.061415" elapsed="0.004362"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:33.054813" elapsed="0.011220">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:34.070148" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:34.069353" elapsed="0.000867"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:34.070353" elapsed="0.000128"/>
</return>
<msg time="2026-04-11T00:52:34.070768" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:34.068476" elapsed="0.002347"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:34.071753" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:34.071172" elapsed="0.001385">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:34.073072" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:34.073926" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:34.074196" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:34.074475" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:34.074738" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:34.074997" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:34.075256" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:34.075633" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:34.075400" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:34.075356" elapsed="0.000388"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:34.076038" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:34.075818" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:34.075797" elapsed="0.000348"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:34.076456" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:34.076217" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:34.076195" elapsed="0.000371"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:34.073663" elapsed="0.002934"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:34.073237" elapsed="0.003396"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:34.067377" elapsed="0.009392">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:35.081789" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:35.080295" elapsed="0.001573"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:35.081999" elapsed="0.000088"/>
</return>
<msg time="2026-04-11T00:52:35.082411" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:35.079353" elapsed="0.003123"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:35.083495" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:35.082857" elapsed="0.001449">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:35.084835" elapsed="0.000056"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:35.085965" elapsed="0.000054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:35.086459" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:35.086915" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:35.087442" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:35.087760" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:35.087946" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:35.088201" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:35.088037" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:35.088017" elapsed="0.000262"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:35.088505" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:35.088332" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:35.088316" elapsed="0.000268"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:35.088793" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:35.088635" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:35.088620" elapsed="0.000249"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:35.085590" elapsed="0.003303"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:35.085008" elapsed="0.003911"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:35.078079" elapsed="0.010937">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:36.092999" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:36.092159" elapsed="0.000913"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:36.093190" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:52:36.093586" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:36.091333" elapsed="0.002311"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:36.094635" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:36.094028" elapsed="0.001444">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:36.095966" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:36.097185" elapsed="0.000075"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:36.097718" elapsed="0.000056"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:36.098172" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:36.098645" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:36.099113" elapsed="0.000049"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:36.099593" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:36.100188" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:36.099803" elapsed="0.000512"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:36.099760" elapsed="0.000612"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:36.100961" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:36.100532" elapsed="0.000562"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:36.100495" elapsed="0.000653"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:36.101687" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:36.101271" elapsed="0.000580"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:36.101235" elapsed="0.000641"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:36.096602" elapsed="0.005297"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:36.096134" elapsed="0.005791"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:36.090281" elapsed="0.011744">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:37.106178" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:37.105434" elapsed="0.000814"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:37.106364" elapsed="0.000562"/>
</return>
<msg time="2026-04-11T00:52:37.107220" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:37.104604" elapsed="0.002672"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:37.108207" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:37.107663" elapsed="0.001333">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:37.109488" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:37.110411" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:37.110888" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:37.111309" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:37.111754" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:37.112161" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:37.112605" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:37.113161" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:37.112802" elapsed="0.000479"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:37.112761" elapsed="0.000574"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:37.113838" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:37.113484" elapsed="0.000473"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:37.113448" elapsed="0.000560"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:37.114500" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:37.114121" elapsed="0.000542"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:37.114088" elapsed="0.000631"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:37.110037" elapsed="0.004737"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:37.109652" elapsed="0.005179"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:37.103456" elapsed="0.011587">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:38.119216" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:38.118307" elapsed="0.000982"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:38.119444" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:52:38.119800" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:38.117513" elapsed="0.002343"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:38.120849" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:38.120231" elapsed="0.001551">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:38.122248" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:38.123246" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:38.123740" elapsed="0.000064"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:38.124467" elapsed="0.000056"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:38.124871" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:38.125138" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:38.125422" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:38.125786" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:38.125554" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:38.125526" elapsed="0.000371"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:38.126196" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:38.125973" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:38.125951" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:38.126620" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:38.126376" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:38.126354" elapsed="0.000376"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:38.122896" elapsed="0.003867"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:38.122496" elapsed="0.004305"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:38.116452" elapsed="0.010483">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:39.131037" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:39.130252" elapsed="0.000855"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:39.131221" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:52:39.131610" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:39.129325" elapsed="0.002343"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:39.133021" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:39.132017" elapsed="0.001836">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:39.134309" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:39.135235" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:39.135687" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:39.136099" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:39.136543" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:39.136960" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:39.137375" elapsed="0.000076"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:39.138103" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:39.137696" elapsed="0.000533"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:39.137645" elapsed="0.000638"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:39.138800" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:39.138439" elapsed="0.000486"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:39.138368" elapsed="0.000608"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:39.139470" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:39.139092" elapsed="0.000500"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:39.139058" elapsed="0.000585"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:39.134889" elapsed="0.004805"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:39.134499" elapsed="0.005250"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:39.128272" elapsed="0.011797">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:40.144316" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:40.143550" elapsed="0.000864"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:40.144540" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:52:40.144901" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:40.142678" elapsed="0.002279"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:40.145890" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:40.145311" elapsed="0.001357">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:40.147151" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:40.148090" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:40.148541" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:40.148964" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:40.149378" elapsed="0.000073"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:40.149825" elapsed="0.000044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:40.150238" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:40.150875" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:40.150467" elapsed="0.000536"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:40.150425" elapsed="0.000632"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:40.151566" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:40.151179" elapsed="0.000511"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:40.151141" elapsed="0.000601"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:40.152051" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:40.151868" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:40.151829" elapsed="0.000301"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:40.147737" elapsed="0.004416"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:40.147312" elapsed="0.004866"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:40.141496" elapsed="0.010775">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:41.157026" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:41.155940" elapsed="0.001135"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:41.157157" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:52:41.157403" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:41.155038" elapsed="0.002403"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:41.158312" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:41.157664" elapsed="0.001193">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:41.159167" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:41.159765" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:41.160042" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:41.160303" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:41.160680" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:41.160949" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:41.161211" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:41.161589" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:41.161337" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:41.161310" elapsed="0.000391"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:41.161999" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:41.161775" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:41.161754" elapsed="0.000353"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:41.162418" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:41.162179" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:41.162158" elapsed="0.000370"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:41.159544" elapsed="0.003016"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:41.159271" elapsed="0.003326"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:41.153779" elapsed="0.008948">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:42.167156" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:42.166340" elapsed="0.000885"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:42.167352" elapsed="0.000114"/>
</return>
<msg time="2026-04-11T00:52:42.167748" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:42.165476" elapsed="0.002327"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:42.168740" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:42.168161" elapsed="0.001495">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:42.170211" elapsed="0.000069"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:42.171435" elapsed="0.000073"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:42.172035" elapsed="0.000066"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:42.172647" elapsed="0.000064"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:42.173275" elapsed="0.000068"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:42.173933" elapsed="0.000087"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:42.174252" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:42.174613" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:42.174372" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:42.174346" elapsed="0.000373"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:42.174997" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:42.174787" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:42.174767" elapsed="0.000335"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:42.175332" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:42.175169" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:42.175148" elapsed="0.000284"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:42.170972" elapsed="0.004484"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:42.170442" elapsed="0.005043"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:42.164126" elapsed="0.011463">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:43.179877" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:43.179100" elapsed="0.000850"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:43.180067" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:52:43.180457" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:43.178262" elapsed="0.002253"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:43.181437" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:43.180866" elapsed="0.001796">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:43.183128" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:43.184055" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:43.184508" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:43.184929" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:43.185344" elapsed="0.000072"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:43.185789" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:43.186248" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:43.186909" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:43.186488" elapsed="0.000515"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:43.186445" elapsed="0.000587"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:43.187257" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:43.187095" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:43.187077" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:43.187563" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:43.187401" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:43.187371" elapsed="0.000268"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:43.183713" elapsed="0.003949"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:43.183286" elapsed="0.004402"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:43.176978" elapsed="0.010806">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:44.191826" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:44.190978" elapsed="0.000920"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:44.192016" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:52:44.192443" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:44.190152" elapsed="0.002360"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:44.193459" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:44.192884" elapsed="0.001491">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:44.194915" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:44.195941" elapsed="0.000068"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:44.196535" elapsed="0.000055"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:44.196972" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:44.197416" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:44.197859" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:44.198438" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:44.199047" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:44.198674" elapsed="0.000548"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:44.198631" elapsed="0.000653"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:44.199824" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:44.199438" elapsed="0.000522"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:44.199373" elapsed="0.000617"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:44.200213" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:44.200054" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:44.200036" elapsed="0.000254"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:44.195562" elapsed="0.004751"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:44.195083" elapsed="0.005256"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:44.189089" elapsed="0.011362">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:45.204504" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:45.203663" elapsed="0.000912"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:45.204693" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:52:45.205014" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:45.202836" elapsed="0.002212"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:45.205634" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:45.205268" elapsed="0.001192">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:45.206757" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:45.207321" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:45.207614" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:45.207874" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:45.208146" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:45.208423" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:45.208685" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:45.209040" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:45.208810" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:45.208785" elapsed="0.000364"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:45.209471" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:45.209222" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:45.209201" elapsed="0.000379"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:45.209872" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:45.209651" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:45.209631" elapsed="0.000346"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:45.207103" elapsed="0.002907"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:45.206857" elapsed="0.003189"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:45.201775" elapsed="0.008402">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:46.214214" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:46.213450" elapsed="0.000835"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:46.214585" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:52:46.214950" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:46.212583" elapsed="0.002423"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:46.215948" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:46.215360" elapsed="0.001370">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:46.217248" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:46.218104" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:46.218371" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:46.218651" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:46.218909" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:46.219166" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:46.219440" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:46.219799" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:46.219570" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:46.219544" elapsed="0.000366"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:46.220202" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:46.219983" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:46.219962" elapsed="0.000348"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:46.220622" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:46.220380" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:46.220359" elapsed="0.000371"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:46.217837" elapsed="0.002924"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:46.217443" elapsed="0.003352"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:46.211531" elapsed="0.009397">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:47.223865" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:47.223324" elapsed="0.000588"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:47.223993" elapsed="0.000056"/>
</return>
<msg time="2026-04-11T00:52:47.224228" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:47.222772" elapsed="0.001491"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:47.224878" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:47.224511" elapsed="0.001210">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:47.226091" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:47.227052" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:47.227510" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:47.227934" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:47.228346" elapsed="0.000072"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:47.228796" elapsed="0.000056"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:47.229233" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:47.230068" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:47.229620" elapsed="0.000580"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:47.229564" elapsed="0.000693"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:47.230840" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:47.230376" elapsed="0.000598"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:47.230342" elapsed="0.000669"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:47.231227" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:47.231066" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:47.231049" elapsed="0.000256"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:47.226695" elapsed="0.004634"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:47.226257" elapsed="0.005098"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:47.222022" elapsed="0.009448">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:48.235573" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:48.234743" elapsed="0.000900"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:48.235765" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:52:48.236118" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:48.233844" elapsed="0.002329"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:48.237093" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:48.236556" elapsed="0.001314">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:48.238327" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:48.239287" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:48.239739" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:48.240154" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:48.240591" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:48.241000" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:48.241442" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:48.242005" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:48.241641" elapsed="0.000487"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:48.241600" elapsed="0.000581"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:48.242702" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:48.242297" elapsed="0.000528"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:48.242263" elapsed="0.000614"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:48.243349" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:48.242994" elapsed="0.000505"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:48.242960" elapsed="0.000590"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:48.238940" elapsed="0.004661"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:48.238519" elapsed="0.005139"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:48.232776" elapsed="0.011115">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:49.247954" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:49.247136" elapsed="0.000886"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:49.248140" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:52:49.248528" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:49.246308" elapsed="0.002276"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:49.249645" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:49.249067" elapsed="0.001784">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:49.251316" elapsed="0.000103"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:49.252274" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:49.252732" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:49.253149" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:49.253591" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:49.254003" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:49.254442" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:49.255000" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:49.254640" elapsed="0.000478"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:49.254601" elapsed="0.000571"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:49.255714" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:49.255286" elapsed="0.000553"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:49.255253" elapsed="0.000637"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:49.256290" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:49.256003" elapsed="0.000362"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:49.255970" elapsed="0.000445"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:49.251927" elapsed="0.004521"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:49.251535" elapsed="0.004949"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:49.245227" elapsed="0.011388">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:50.260641" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:50.259816" elapsed="0.000897"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:50.260839" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:52:50.261202" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:50.258967" elapsed="0.002291"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:50.262195" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:50.261643" elapsed="0.001356">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:50.263498" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:50.264530" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:50.264966" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:50.265259" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:50.265458" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:50.265646" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:50.265863" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:50.266132" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:50.265966" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:50.265945" elapsed="0.000342"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:50.266523" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:50.266346" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:50.266329" elapsed="0.000273"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:50.266813" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:50.266654" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:50.266639" elapsed="0.000250"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:50.264129" elapsed="0.002783"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:50.263663" elapsed="0.003275"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:50.257909" elapsed="0.009129">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:51.271367" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:51.270574" elapsed="0.000896"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:51.271594" elapsed="0.000099"/>
</return>
<msg time="2026-04-11T00:52:51.272164" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:51.269611" elapsed="0.002625"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:51.273270" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:51.272639" elapsed="0.002104">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:51.275254" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:51.276261" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:51.276750" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:51.277191" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:51.277690" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:51.278142" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:51.278617" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:51.279220" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:51.278834" elapsed="0.000511"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:51.278790" elapsed="0.000644"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:51.279944" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:51.279565" elapsed="0.000508"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:51.279529" elapsed="0.000599"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:51.280657" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:51.280247" elapsed="0.000540"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:51.280212" elapsed="0.000631"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:51.275894" elapsed="0.005002"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:51.275463" elapsed="0.005494"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:51.268362" elapsed="0.012822">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:52.285362" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:52.284596" elapsed="0.000867"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:52.285600" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:52:52.285959" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:52.283719" elapsed="0.002295"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:52.286971" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:52.286377" elapsed="0.001384">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:52.288423" elapsed="0.000056"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:52.289316" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:52.289533" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:52.289723" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:52.289911" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:52.290097" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:52.290284" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:52.290558" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:52.290376" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:52.290357" elapsed="0.000281"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:52.290851" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:52.290691" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:52.290675" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:52.291142" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:52.290981" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:52.290966" elapsed="0.000258"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:52.288996" elapsed="0.002251"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:52.288595" elapsed="0.002678"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:52.282620" elapsed="0.008752">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:53.295848" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:53.294964" elapsed="0.000963"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:53.296059" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T00:52:53.296480" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:53.294030" elapsed="0.002513"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:53.297563" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:53.296933" elapsed="0.004943">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:53.302379" elapsed="0.000087"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:53.303337" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:53.303556" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:53.303770" elapsed="0.000025"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:53.303966" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:53.304149" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:53.304338" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:53.304630" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:53.304454" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:53.304432" elapsed="0.000279"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:53.304926" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:53.304768" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:53.304752" elapsed="0.000321"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:53.305287" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:53.305126" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:53.305111" elapsed="0.000252"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:53.303104" elapsed="0.002298"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:53.302588" elapsed="0.002845"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:53.292746" elapsed="0.012790">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:54.309587" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:54.308758" elapsed="0.000898"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:54.309777" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:52:54.310136" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:54.307929" elapsed="0.002263"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:54.310786" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:54.310439" elapsed="0.000861">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:54.311622" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:54.312198" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:54.312492" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:54.312753" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:54.313012" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:54.313267" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:54.313559" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:54.313913" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:54.313685" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:54.313660" elapsed="0.000368"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:54.314322" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:54.314100" elapsed="0.000319"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:54.314078" elapsed="0.000376"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:54.314754" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:54.314528" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:54.314505" elapsed="0.000359"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:54.311977" elapsed="0.002918"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:54.311725" elapsed="0.003206"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:54.306851" elapsed="0.008212">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:55.319311" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:55.318554" elapsed="0.000855"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:55.319533" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:52:55.319948" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:55.317697" elapsed="0.002312"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:55.320701" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:55.320322" elapsed="0.000892">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.321541" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.322206" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.322496" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.322755" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.323009" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.323266" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.323546" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.324255" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:55.324004" elapsed="0.000332"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:55.323647" elapsed="0.000724"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.324695" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:55.324469" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:55.324447" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.325101" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:55.324876" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:55.324854" elapsed="0.000355"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:52:55.321986" elapsed="0.003255"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:52:55.321646" elapsed="0.003631"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:55.316482" elapsed="0.008948">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:52:55.325557" level="FAIL">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Linear Topology On Member</arg>
<arg>${SWITCHES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.963169" elapsed="30.362517">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Linear Topology.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.951196" elapsed="30.374710">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t4" name="Check Stats Are Not Frozen" line="52">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:52:55.330031" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:52:55.329765" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:55.331319" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:55.331194" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:55.331174" elapsed="0.000228"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:52:55.336247" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:52:55.336132" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T00:52:55.336114" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:52:55.337368" 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-11T00:52:55.336953" elapsed="0.000465"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:52:55.337891" 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-11T00:52:55.337599" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:52:55.337962" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:52:55.338115" 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-11T00:52:55.336569" elapsed="0.001570"/>
</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-11T00:52:55.338506" 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-11T00:52:55.338748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:52:55.338604" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:52:55.338587" elapsed="0.000288"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:52:55.338345" elapsed="0.000553"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:52:55.338192" elapsed="0.000730"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:52:55.335764" elapsed="0.003210"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:52:55.330907" elapsed="0.008120"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:52:55.330474" elapsed="0.008596"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:52:55.327187" elapsed="0.011932"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:55.341105" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:55.340810" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:55.341178" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:52:55.341323" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:55.340466" elapsed="0.000881"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:55.341973" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:55.341519" elapsed="0.000788">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.342527" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.342762" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.342939" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.343107" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.343273" elapsed="0.000020"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:52:55.343338" elapsed="0.000015"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:52:55.340110" elapsed="0.003348">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.343625" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.343818" elapsed="0.000021"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.344001" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.344181" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:55.344399" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:52:55.339783" elapsed="0.004725">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:56.348736" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:56.347950" elapsed="0.000853"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:56.348919" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:52:56.349267" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:56.347045" elapsed="0.002277"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:56.350834" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:56.349700" elapsed="0.001962">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:56.352134" elapsed="0.000066"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:52:56.352720" elapsed="0.000184"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:56.353260" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:56.353674" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:56.354100" elapsed="0.000046"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:52:56.354249" elapsed="0.000020"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:52:56.346198" elapsed="0.008168">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:56.354549" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:56.354718" elapsed="0.000021"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:56.354901" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:56.355073" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:56.355270" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:52:56.345195" elapsed="0.010183">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:57.359738" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:57.358910" elapsed="0.000896"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:57.359927" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:52:57.360336" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:57.358051" elapsed="0.002393"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:57.361403" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:57.360799" elapsed="0.001125">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:57.362224" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:52:57.362902" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:57.363159" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:57.363420" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:57.363666" elapsed="0.000027"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:52:57.363756" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:52:57.357122" elapsed="0.006783">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:57.364152" elapsed="0.000031"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:57.364408" elapsed="0.000030"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:57.364665" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:57.364910" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:57.365185" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:52:57.356140" elapsed="0.009194">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:58.369608" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:58.368828" elapsed="0.000852"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:58.369798" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:52:58.370317" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:58.367976" elapsed="0.002400"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:58.371446" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:58.370767" elapsed="0.001422">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:58.372685" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:52:58.373209" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:58.373639" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:58.374031" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:58.374467" elapsed="0.000047"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:52:58.374617" elapsed="0.000037"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:52:58.367097" elapsed="0.007755">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:58.375218" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:58.375651" elapsed="0.000048"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:58.376063" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:58.376484" elapsed="0.000048"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:58.376928" elapsed="0.000045"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:52:58.366097" elapsed="0.011075">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:52:59.381782" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:52:59.380932" elapsed="0.000929"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:52:59.381993" elapsed="0.000098"/>
</return>
<msg time="2026-04-11T00:52:59.382377" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:52:59.379974" elapsed="0.002491"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:52:59.383544" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:52:59.382820" elapsed="0.001656">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:59.384995" elapsed="0.000059"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:52:59.385602" elapsed="0.000058"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:59.386018" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:59.386439" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:59.386900" elapsed="0.000054"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:52:59.387064" elapsed="0.000037"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:52:59.379088" elapsed="0.008222">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:59.387724" elapsed="0.000049"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:59.388209" elapsed="0.000410"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:59.388816" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:59.388998" elapsed="0.000111"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:52:59.389299" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:52:59.378082" elapsed="0.011347">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:00.393710" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:00.392927" elapsed="0.000853"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:00.393896" elapsed="0.000109"/>
</return>
<msg time="2026-04-11T00:53:00.394285" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:00.392090" elapsed="0.002252"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:00.395361" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:00.394732" elapsed="0.001448">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:00.396672" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:00.397193" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:00.397617" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:00.398084" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:00.398471" elapsed="0.000030"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:00.398567" elapsed="0.000024"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:00.391244" elapsed="0.007472">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:00.398947" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:00.399182" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:00.399456" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:00.399703" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:00.399977" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:00.390276" elapsed="0.009851">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:01.404288" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:01.403479" elapsed="0.000880"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:01.404481" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T00:53:01.404710" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:01.402650" elapsed="0.002094"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:01.405370" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:01.404973" elapsed="0.000915">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:01.406186" elapsed="0.000030"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:01.406534" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:01.406782" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:01.407018" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:01.407256" elapsed="0.000045"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:01.407490" elapsed="0.000025"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:01.401809" elapsed="0.005840">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:01.407915" elapsed="0.000031"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:01.408154" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:01.408426" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:01.408671" elapsed="0.000338"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:01.409266" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:01.400885" elapsed="0.008554">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:02.414016" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:02.413098" elapsed="0.001025"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:02.414258" elapsed="0.000096"/>
</return>
<msg time="2026-04-11T00:53:02.414626" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:02.412252" elapsed="0.002411"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:02.415420" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:02.414893" elapsed="0.001067">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:02.416337" elapsed="0.000040"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:02.416705" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:02.416958" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:02.417199" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:02.417473" elapsed="0.000034"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:02.417584" elapsed="0.000024"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:02.411412" elapsed="0.006329">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:02.417975" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:02.418213" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:02.418489" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:02.418737" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:02.419019" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:02.410352" elapsed="0.008822">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:03.423559" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:03.422700" elapsed="0.000919"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:03.423710" elapsed="0.000053"/>
</return>
<msg time="2026-04-11T00:53:03.423937" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:03.421841" elapsed="0.002131"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:03.424616" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:03.424193" elapsed="0.000927">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:03.425436" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:03.426095" elapsed="0.000039"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:03.426430" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:03.426708" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:03.427022" elapsed="0.000032"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:03.427122" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:03.420928" elapsed="0.006350">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:03.427568" elapsed="0.000035"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:03.427875" elapsed="0.000036"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:03.428147" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:03.428407" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:03.428688" elapsed="0.000027"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:03.419964" elapsed="0.008875">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:04.433864" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:04.433068" elapsed="0.000865"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:04.434057" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:53:04.434447" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:04.432148" elapsed="0.002358"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:04.435600" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:04.434917" elapsed="0.001440">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:04.436896" elapsed="0.000053"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:04.437448" elapsed="0.000063"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:04.437770" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:04.437939" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:04.438105" elapsed="0.000019"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:04.438171" elapsed="0.000015"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:04.431267" elapsed="0.007016">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:04.438460" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:04.438628" elapsed="0.000019"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:04.438808" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:04.438979" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:04.439173" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:04.429636" elapsed="0.009643">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:05.444026" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:05.443188" elapsed="0.000907"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:05.444416" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:53:05.444786" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:05.442329" elapsed="0.002515"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:05.445878" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:05.445198" elapsed="0.001518">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:05.447180" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:05.447738" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:05.448137" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:05.448550" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:05.448931" elapsed="0.000048"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:05.449077" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:05.441445" elapsed="0.007861">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:05.449706" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:05.450121" elapsed="0.000048"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:05.450549" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:05.450725" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:05.450921" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:05.440478" elapsed="0.010550">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:06.455945" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:06.455134" elapsed="0.000879"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:06.456135" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:53:06.456536" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:06.454279" elapsed="0.002314"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:06.457621" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:06.456946" elapsed="0.001467">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:06.458868" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:06.459412" elapsed="0.000101"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:06.459862" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:06.460239" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:06.460605" elapsed="0.000021"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:06.460670" elapsed="0.000015"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:06.453440" elapsed="0.007337">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:06.460940" elapsed="0.000020"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:06.461105" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:06.461285" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:06.461546" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:06.461746" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:06.451824" elapsed="0.010031">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:07.466126" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:07.465329" elapsed="0.000872"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:07.466337" elapsed="0.000114"/>
</return>
<msg time="2026-04-11T00:53:07.466739" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:07.464483" elapsed="0.002313"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:07.467807" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:07.467147" elapsed="0.001469">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:07.469116" elapsed="0.000053"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:07.469693" elapsed="0.000058"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:07.470093" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:07.470511" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:07.470888" elapsed="0.000043"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:07.471031" elapsed="0.000034"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:07.463614" elapsed="0.007647">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:07.471653" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:07.472023" elapsed="0.000044"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:07.472444" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:07.472902" elapsed="0.000048"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:07.473338" elapsed="0.000071"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:07.462649" elapsed="0.010968">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:08.478422" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:08.477588" elapsed="0.000908"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:08.478614" elapsed="0.000073"/>
</return>
<msg time="2026-04-11T00:53:08.478865" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:08.476729" elapsed="0.002171"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:08.479537" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:08.479118" elapsed="0.000930">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:08.480341" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:08.480689" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:08.480937" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:08.481176" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:08.481520" elapsed="0.000033"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:08.481619" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:08.475323" elapsed="0.006444">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:08.481997" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:08.482245" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:08.482517" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:08.482762" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:08.483039" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:08.474367" elapsed="0.008823">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:09.487304" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:09.486566" elapsed="0.000881"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:09.487571" elapsed="0.000075"/>
</return>
<msg time="2026-04-11T00:53:09.487826" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:09.485735" elapsed="0.002127"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:09.488503" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:09.488084" elapsed="0.000919">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:09.489299" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:09.489651" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:09.489897" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:09.490132" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:09.490365" elapsed="0.000048"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:09.490476" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:09.484893" elapsed="0.005729">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:09.490854" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:09.491083" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:09.491329" elapsed="0.000029"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:09.491601" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:09.491877" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:09.483939" elapsed="0.008084">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:10.496827" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:10.495985" elapsed="0.000913"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:10.497015" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:53:10.497371" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:10.494590" elapsed="0.002868"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:10.498201" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:10.497799" elapsed="0.000930">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:10.499108" elapsed="0.000034"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:10.499462" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:10.499721" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:10.499966" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:10.500261" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:10.500353" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:10.493736" elapsed="0.006790">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:10.500772" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:10.501018" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:10.501269" elapsed="0.000029"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:10.501534" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:10.501822" elapsed="0.000035"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:10.492808" elapsed="0.009189">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:11.504920" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:11.504377" elapsed="0.000592"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:11.505057" elapsed="0.000064"/>
</return>
<msg time="2026-04-11T00:53:11.505305" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:11.503831" elapsed="0.001511"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:11.506031" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:11.505592" elapsed="0.001077">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:11.507174" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:11.507756" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:11.508194" elapsed="0.000057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:11.508664" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:11.509055" elapsed="0.000044"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:11.509205" elapsed="0.000049"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:11.503240" elapsed="0.006330">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:11.510015" elapsed="0.000051"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:11.510450" elapsed="0.000056"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:11.510870" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:11.511049" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:11.511245" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:11.502599" elapsed="0.008756">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:12.516083" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:12.514821" elapsed="0.001334"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:12.516272" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:53:12.516666" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:12.513847" elapsed="0.002877"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:12.517738" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:12.517082" elapsed="0.001437">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:12.519210" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:12.519801" elapsed="0.000062"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:12.520214" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:12.520630" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:12.521012" elapsed="0.000045"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:12.521156" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:12.513009" elapsed="0.008403">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:12.521780" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:12.522149" elapsed="0.000045"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:12.522578" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:12.523013" elapsed="0.000048"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:12.523484" elapsed="0.000047"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:12.512078" elapsed="0.011646">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:13.528204" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:13.527301" elapsed="0.000978"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:13.528440" elapsed="0.000088"/>
</return>
<msg time="2026-04-11T00:53:13.528826" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:13.526427" elapsed="0.002435"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:13.529535" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:13.529104" elapsed="0.000938">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:13.530341" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:13.530689" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:13.530940" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:13.531186" elapsed="0.000037"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:13.531468" elapsed="0.000031"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:13.531565" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:13.525535" elapsed="0.006181">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:13.531949" elapsed="0.000046"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:13.532234" elapsed="0.000030"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:13.532626" elapsed="0.000034"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:13.532886" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:13.533166" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:13.524540" elapsed="0.008779">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:14.537545" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:14.536629" elapsed="0.001007"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:14.537787" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T00:53:14.538152" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:14.535808" elapsed="0.002398"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:14.539704" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:14.538587" elapsed="0.001894">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:14.540936" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:14.541526" elapsed="0.000062"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:14.541946" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:14.542214" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:14.542490" elapsed="0.000030"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:14.542587" elapsed="0.000024"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:14.534966" elapsed="0.007810">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:14.543019" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:14.543263" elapsed="0.000030"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:14.543552" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:14.543875" elapsed="0.000036"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:14.544179" elapsed="0.000030"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:14.534042" elapsed="0.010297">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:15.548568" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:15.547768" elapsed="0.000869"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:15.548755" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:53:15.549109" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:15.546941" elapsed="0.002224"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:15.550192" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:15.549545" elapsed="0.001425">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:15.551458" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:15.551976" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:15.552366" elapsed="0.000076"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:15.552782" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:15.553289" elapsed="0.000047"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:15.553468" elapsed="0.000038"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:15.546045" elapsed="0.007657">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:15.554125" elapsed="0.000051"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:15.554539" elapsed="0.000046"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:15.554915" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:15.555087" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:15.555284" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:15.545080" elapsed="0.010325">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:16.559420" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:16.558605" elapsed="0.000887"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:16.559605" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:53:16.559934" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:16.557787" elapsed="0.002183"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:16.560643" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:16.560200" elapsed="0.002966">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:16.563521" elapsed="0.000034"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:16.563868" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:16.564130" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:16.564400" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:16.564653" elapsed="0.000030"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:16.564748" elapsed="0.000024"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:16.556958" elapsed="0.007944">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:16.565143" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:16.565406" elapsed="0.000031"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:16.565673" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:16.565924" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:16.566211" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:16.556057" elapsed="0.010312">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:17.570466" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:17.569711" elapsed="0.000827"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:17.570649" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:53:17.570998" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:17.568888" elapsed="0.002166"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:17.572071" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:17.571432" elapsed="0.001701">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:17.573625" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:17.574144" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:17.574565" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:17.574947" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:17.575323" elapsed="0.000044"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:17.575494" elapsed="0.000038"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:17.568046" elapsed="0.007681">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:17.576138" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:17.576541" elapsed="0.000046"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:17.576914" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:17.577089" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:17.577287" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:17.567066" elapsed="0.010351">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:18.581626" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:18.580804" elapsed="0.000895"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:18.581819" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:53:18.582179" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:18.579943" elapsed="0.002294"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:18.583282" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:18.582625" elapsed="0.001460">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:18.584590" elapsed="0.000052"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:18.585163" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:18.585592" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:18.585977" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:18.586161" elapsed="0.000021"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:18.586227" elapsed="0.000017"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:18.579082" elapsed="0.007258">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:18.586522" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:18.586691" elapsed="0.000019"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:18.587140" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:18.587318" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:18.587535" elapsed="0.000022"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:18.578133" elapsed="0.009514">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:19.591935" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:19.591085" elapsed="0.000925"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:19.592128" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:53:19.592534" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:19.590246" elapsed="0.002347"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:19.593700" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:19.592989" elapsed="0.001546">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:19.595004" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:19.595570" elapsed="0.000060"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:19.596045" elapsed="0.000059"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:19.596497" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:19.596942" elapsed="0.000050"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:19.597162" elapsed="0.000047"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:19.589363" elapsed="0.008092">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:19.597952" elapsed="0.000069"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:19.598380" elapsed="0.000080"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:19.598829" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:19.599071" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:19.599266" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:19.588460" elapsed="0.010915">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:20.603343" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:20.602780" elapsed="0.000632"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:20.603496" elapsed="0.000059"/>
</return>
<msg time="2026-04-11T00:53:20.603733" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:20.601893" elapsed="0.001875"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:20.604406" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:20.603987" elapsed="0.000924">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:20.605213" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:20.605560" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:20.605810" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:20.606052" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:20.606290" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:20.606381" elapsed="0.000044"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:20.601041" elapsed="0.005509">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:20.606793" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:20.607124" elapsed="0.000030"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:20.607379" elapsed="0.000050"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:20.607643" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:20.607920" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:20.600107" elapsed="0.007965">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:21.612895" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:21.612304" elapsed="0.000645"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:21.613044" elapsed="0.000064"/>
</return>
<msg time="2026-04-11T00:53:21.613319" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:21.611414" elapsed="0.001943"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:21.614021" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:21.613602" elapsed="0.000961">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:21.614899" elapsed="0.000037"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:21.615243" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:21.615518" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:21.615788" elapsed="0.000032"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:21.616030" elapsed="0.000027"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:21.616121" elapsed="0.000021"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:21.610500" elapsed="0.005769">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:21.616518" elapsed="0.000031"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:21.616753" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:21.617046" elapsed="0.000036"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:21.617327" elapsed="0.000032"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:21.617634" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:21.608823" elapsed="0.008963">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:22.620589" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:22.620053" elapsed="0.000584"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:22.620714" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T00:53:22.620942" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:22.619528" elapsed="0.001448"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:22.621630" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:22.621203" elapsed="0.000925">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:22.622445" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:22.622773" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:22.623024" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:22.623361" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:22.623632" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:22.623724" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:22.618978" elapsed="0.004893">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:22.624101" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:22.624333" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:22.624625" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:22.624869" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:22.625140" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:22.618337" elapsed="0.006952">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:23.630158" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:23.629308" elapsed="0.000918"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:23.630347" elapsed="0.000115"/>
</return>
<msg time="2026-04-11T00:53:23.630747" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:23.628421" elapsed="0.002380"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:23.631811" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:23.631153" elapsed="0.001452">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:23.633065" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:23.633646" elapsed="0.000057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:23.634050" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:23.634493" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:23.634894" elapsed="0.000044"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:23.635037" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:23.626997" elapsed="0.008274">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:23.635670" elapsed="0.000048"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:23.636047" elapsed="0.000045"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:23.636480" elapsed="0.000050"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:23.636867" elapsed="0.000044"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:23.637348" elapsed="0.000075"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:23.625992" elapsed="0.011632">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:24.641827" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:24.641049" elapsed="0.000847"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:24.642014" elapsed="0.000102"/>
</return>
<msg time="2026-04-11T00:53:24.642431" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:24.640195" elapsed="0.002297"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:24.643659" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:24.642991" elapsed="0.001444">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:24.644901" elapsed="0.000052"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:24.645454" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:24.645858" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:24.646299" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:24.646719" elapsed="0.000045"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:24.646864" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:24.639338" elapsed="0.007756">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:24.647327" elapsed="0.000028"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:24.647580" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:24.647832" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:24.648074" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:24.648347" elapsed="0.000027"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:24.638420" elapsed="0.010100">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:25.653366" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:25.652602" elapsed="0.000871"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:25.653594" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:53:25.653956" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:25.651189" elapsed="0.002823"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:25.655081" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:25.654367" elapsed="0.001263">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.655928" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.656256" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.656602" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.656853" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.657091" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:53:25.657182" elapsed="0.000024"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:25.650303" elapsed="0.007029">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.657586" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.657818" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.658068" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.658308" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.658597" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:25.649357" elapsed="0.009474">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:53:25.658968" level="FAIL">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>Check Flow Stats Are Not Frozen</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:52:55.339285" elapsed="30.319810">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check that duration flow stat is increasing.</doc>
<status status="FAIL" start="2026-04-11T00:52:55.326487" elapsed="30.332821">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t5" name="Check Flows In Operational DS" line="56">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:53:25.663745" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:53:25.663477" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:53:25.665061" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:25.664934" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:25.664912" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:53:25.669849" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:25.669743" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:25.669725" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:25.670945" 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-11T00:53:25.670539" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:25.671443" 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-11T00:53:25.671141" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:25.671514" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:53:25.671665" 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-11T00:53:25.670143" elapsed="0.001547"/>
</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-11T00:53:25.672051" 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-11T00:53:25.672293" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:53:25.672147" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:53:25.672131" elapsed="0.000237"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:53:25.671907" elapsed="0.000498"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:25.671747" elapsed="0.000688"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:53:25.669374" elapsed="0.003115"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:53:25.664639" elapsed="0.007904"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:25.664178" elapsed="0.008410"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:53:25.660568" elapsed="0.012071"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:25.674574" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:25.674259" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:25.674647" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:53:25.674793" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:25.673907" elapsed="0.000910"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:25.675221" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:25.674987" elapsed="0.000554">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.675738" elapsed="0.000022"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.675927" elapsed="0.000053"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:25.676164" elapsed="0.000020"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:25.673333" elapsed="0.002943">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:26.679964" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:26.679077" elapsed="0.000961"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:26.680162" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:53:26.680568" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:26.678246" elapsed="0.002381"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:26.681676" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:26.681019" elapsed="0.001521">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:26.683020" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:26.683492" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:26.683966" elapsed="0.000048"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:26.677177" elapsed="0.007058">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:27.687857" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:27.687092" elapsed="0.000832"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:27.688041" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:53:27.688446" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:27.686275" elapsed="0.002230"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:27.689454" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:27.688881" elapsed="0.001317">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:27.690686" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:27.691113" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:27.691574" elapsed="0.000046"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:27.685198" elapsed="0.006625">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:28.696044" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:28.694729" elapsed="0.001385"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:28.696236" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:53:28.696625" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:28.693883" elapsed="0.002798"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:28.697653" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:28.697029" elapsed="0.001314">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:28.698658" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:28.698926" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:28.699197" elapsed="0.000028"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:28.692806" elapsed="0.006549">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:29.703131" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:29.702219" elapsed="0.000980"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:29.703315" elapsed="0.000106"/>
</return>
<msg time="2026-04-11T00:53:29.703698" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:29.701336" elapsed="0.002417"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:29.704666" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:29.704102" elapsed="0.001329">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:29.705893" elapsed="0.000048"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:29.706312" elapsed="0.000044"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:29.706772" elapsed="0.000044"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:29.700244" elapsed="0.006776">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:30.710665" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:30.709855" elapsed="0.000879"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:30.710852" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:53:30.711205" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:30.709025" elapsed="0.002236"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:30.712189" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:30.711646" elapsed="0.001315">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:30.713452" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:30.713881" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:30.714323" elapsed="0.000046"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:30.707979" elapsed="0.006672">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:31.718174" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:31.717456" elapsed="0.000784"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:31.718350" elapsed="0.000106"/>
</return>
<msg time="2026-04-11T00:53:31.718726" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:31.716651" elapsed="0.002129"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:31.719740" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:31.719124" elapsed="0.001669">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:31.721102" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:31.721414" elapsed="0.000032"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:31.721707" elapsed="0.000030"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:31.715633" elapsed="0.006238">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:32.725772" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:32.724985" elapsed="0.000855"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:32.725957" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T00:53:32.726318" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:32.724133" elapsed="0.002241"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:32.727306" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:32.726760" elapsed="0.001478">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:32.728729" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:32.729166" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:32.729634" elapsed="0.000048"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:32.722918" elapsed="0.006974">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:33.733567" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:33.732781" elapsed="0.000856"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:33.733756" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:53:33.734111" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:33.731927" elapsed="0.002239"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:33.735131" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:33.734579" elapsed="0.001373">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:33.736459" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:33.736986" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:33.737481" elapsed="0.000048"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:33.730892" elapsed="0.006890">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:34.741481" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:34.740694" elapsed="0.000854"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:34.741665" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T00:53:34.742010" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:34.739882" elapsed="0.002181"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:34.742967" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:34.742437" elapsed="0.001323">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:34.744209" elapsed="0.000048"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:34.744657" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:34.745085" elapsed="0.000043"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:34.738838" elapsed="0.006542">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:35.750279" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:35.749324" elapsed="0.001026"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:35.750512" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:53:35.750867" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:35.748258" elapsed="0.002664"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:35.752028" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:35.751283" elapsed="0.001576">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:35.753362" elapsed="0.000077"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:35.753838" elapsed="0.000044"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:35.754373" elapsed="0.000052"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:35.746652" elapsed="0.007972">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:53:35.754725" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Flows On Member</arg>
<arg>${all_flows}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:53:25.672803" elapsed="10.082020">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Flows in operational DS.</doc>
<status status="FAIL" start="2026-04-11T00:53:25.659856" elapsed="10.095137">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t6" name="Check Groups In Operational DS" line="60">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:53:35.758617" elapsed="0.000261"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:53:35.758310" elapsed="0.000634"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:53:35.760050" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:35.759910" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:35.759885" elapsed="0.000241"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:53:35.765052" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:35.764916" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:35.764894" elapsed="0.000238"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:35.766325" 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-11T00:53:35.765826" elapsed="0.000527"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:35.766836" 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-11T00:53:35.766539" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:35.766905" elapsed="0.000036"/>
</return>
<msg time="2026-04-11T00:53:35.767069" 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-11T00:53:35.765432" elapsed="0.001662"/>
</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-11T00:53:35.767493" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:35.767747" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:53:35.767595" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:53:35.767578" elapsed="0.000248"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:53:35.767318" elapsed="0.000530"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:35.767153" elapsed="0.000722"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:53:35.764483" elapsed="0.003445"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:53:35.759596" elapsed="0.008390"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:35.759105" elapsed="0.008929"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:53:35.756018" elapsed="0.012071"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:35.770210" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:35.769859" elapsed="0.000383"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:35.770292" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:53:35.770467" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:35.769247" elapsed="0.001246"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:35.770904" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:35.770653" elapsed="0.000639">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:35.771608" elapsed="0.000024"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:35.771807" elapsed="0.000021"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:35.772003" elapsed="0.000020"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:35.768840" elapsed="0.003282">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:36.775846" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:36.775044" elapsed="0.000871"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:36.776037" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:53:36.776429" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:36.774185" elapsed="0.002305"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:36.777382" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:36.776839" elapsed="0.001322">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:36.778669" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:36.779096" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:36.779560" elapsed="0.000047"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:36.773102" elapsed="0.006710">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:37.783512" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:37.782702" elapsed="0.000878"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:37.783696" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:53:37.784048" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:37.781884" elapsed="0.002220"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:37.785023" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:37.784485" elapsed="0.001316">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:37.786258" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:37.786748" elapsed="0.000063"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:37.787260" elapsed="0.000051"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:37.780815" elapsed="0.006759">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:38.791238" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:38.790502" elapsed="0.000802"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:38.791452" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:53:38.791804" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:38.789682" elapsed="0.002233"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:38.793049" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:38.792273" elapsed="0.001306">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:38.793899" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:38.794167" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:38.794464" elapsed="0.000029"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:38.788635" elapsed="0.005992">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:39.798290" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:39.797545" elapsed="0.000814"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:39.798514" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:53:39.798872" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:39.796711" elapsed="0.002217"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:39.799860" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:39.799277" elapsed="0.001388">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:39.801167" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:39.801629" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:39.802063" elapsed="0.000044"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:39.795613" elapsed="0.006698">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:40.806036" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:40.805195" elapsed="0.000922"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:40.806237" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:53:40.806632" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:40.804316" elapsed="0.002372"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:40.807614" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:40.807037" elapsed="0.001437">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:40.808938" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:40.809379" elapsed="0.000075"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:40.809872" elapsed="0.000048"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:40.803256" elapsed="0.006884">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:41.813778" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:41.812937" elapsed="0.000915"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:41.813966" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:53:41.814322" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:41.812097" elapsed="0.002281"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:41.815298" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:41.814761" elapsed="0.001428">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:41.816698" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:41.817122" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:41.817588" elapsed="0.000047"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:41.811057" elapsed="0.006842">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:42.822218" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:42.821471" elapsed="0.000817"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:42.822459" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:53:42.822816" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:42.820614" elapsed="0.002258"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:42.823934" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:42.823353" elapsed="0.001365">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:42.825174" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:42.825639" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:42.826076" elapsed="0.000045"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:42.819557" elapsed="0.006817">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:43.829775" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:43.829022" elapsed="0.000905"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:43.830043" elapsed="0.000073"/>
</return>
<msg time="2026-04-11T00:53:43.830418" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:43.828210" elapsed="0.002268"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:43.831634" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:43.830826" elapsed="0.001325">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:43.832460" elapsed="0.000033"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:43.832727" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:43.832995" elapsed="0.000027"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:43.827252" elapsed="0.005896">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:44.836842" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:44.836062" elapsed="0.000852"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:44.837030" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:53:44.837410" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:44.835164" elapsed="0.002307"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:44.838363" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:44.837823" elapsed="0.001309">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:44.839638" elapsed="0.000054"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:44.840068" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:44.840530" elapsed="0.000046"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:44.834092" elapsed="0.006688">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.847617" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:45.846833" elapsed="0.000855"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:53:45.847808" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:53:45.848199" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:53:45.842940" elapsed="0.005319"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:53:45.849372" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.848816" elapsed="0.001353">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.850653" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.851179" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.851646" elapsed="0.000046"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.841795" elapsed="0.010103">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:53:45.852082" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Groups On Member</arg>
<arg>${all_groups}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:53:35.768262" elapsed="10.084068">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Groups in operational DS.</doc>
<status status="FAIL" start="2026-04-11T00:53:35.755444" elapsed="10.097248">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t7" name="Check Flows In Switch" line="68">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:53:45.855931" elapsed="0.000256"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:53:45.855664" elapsed="0.000577"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.857277" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:45.857152" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:45.857131" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.862111" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:45.862005" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:45.861986" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.863179" 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-11T00:53:45.862800" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.863670" 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-11T00:53:45.863366" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:45.863740" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:53:45.863892" 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-11T00:53:45.862422" elapsed="0.001494"/>
</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-11T00:53:45.864289" 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-11T00:53:45.864548" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:53:45.864399" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:53:45.864368" elapsed="0.000255"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:53:45.864143" elapsed="0.000503"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.863973" elapsed="0.000701"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:53:45.861648" elapsed="0.003079"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:53:45.856862" elapsed="0.007917"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:45.856420" elapsed="0.008402"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:53:45.853544" elapsed="0.011328"/>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<msg time="2026-04-11T00:53:45.869294" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<arg>${all_flows}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-11T00:53:45.865131" elapsed="0.004204">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Check Flows in switch.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.853059" elapsed="0.016425">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s4-t8" name="Check Entity Owner Status And Find Owner and Successor Before Fail" line="72">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:53:45.872736" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:53:45.872456" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.874139" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:45.874027" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:45.874005" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.879511" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:45.879378" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:45.879359" elapsed="0.000221"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.880597" 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-11T00:53:45.880197" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.881073" 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-11T00:53:45.880788" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:45.881161" elapsed="0.000036"/>
</return>
<msg time="2026-04-11T00:53:45.881352" 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-11T00:53:45.879806" elapsed="0.001595"/>
</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-11T00:53:45.881841" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.882151" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:53:45.881963" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:53:45.881942" elapsed="0.000310"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:53:45.881654" elapsed="0.000629"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.881468" elapsed="0.000847"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:53:45.878990" elapsed="0.003413"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:53:45.873697" elapsed="0.008786"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:45.873226" elapsed="0.009317"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:53:45.870283" elapsed="0.012334"/>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.919398" 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-11T00:53:45.918977" elapsed="0.000455"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.919894" 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-11T00:53:45.919603" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:45.919969" elapsed="0.000038"/>
</return>
<msg time="2026-04-11T00:53:45.920147" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:45.918604" elapsed="0.001568"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:45.924875" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:45.924686" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:45.925058" elapsed="0.000200"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:45.925645" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:45.925434" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.926115" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:45.925863" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:45.926306" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:45.926945" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:45.926737" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.927400" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:45.927143" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.927936" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:45.927600" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.928377" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:45.928142" elapsed="0.000296"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.928872" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:45.928592" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:45.935631" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:45.944680" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.945463" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:45.945050" elapsed="0.000440"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:45.946628" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.946076" elapsed="0.000707">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.946946" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.945681" elapsed="0.001388">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.947247" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.947444" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.947627" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.947800" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.947970" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.948140" elapsed="0.000045"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.948337" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.948528" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.948695" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.948973" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.949204" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.949413" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:45.948840" elapsed="0.000656"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.948767" elapsed="0.000759"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.949671" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.949732" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.944173" elapsed="0.005665">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.949946" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.933323" elapsed="0.016726">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.950228" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.954579" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.954776" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.954843" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.924096" elapsed="0.030853">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:45.955061" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:45.955105" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:45.923536" elapsed="0.031591"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.955333" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:45.955215" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:45.955194" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:45.956736" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.957415" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:45.957100" elapsed="0.000343"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:45.958221" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.957961" elapsed="0.000346">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.958368" elapsed="0.000039"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.957625" elapsed="0.000873">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.958673" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.958847" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.959023" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.959194" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.959360" elapsed="0.000033"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.959543" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.959716" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.959886" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.960094" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.960412" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.960590" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.960755" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:45.960258" elapsed="0.000550"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.960179" elapsed="0.000655"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.960976" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.961034" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.956179" elapsed="0.004960">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:45.961251" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:45.961295" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:45.955571" elapsed="0.005747"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:45.962123" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.961630" elapsed="0.000554">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:45.961414" elapsed="0.000833">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:45.961394" elapsed="0.000885">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.962325" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.922975" elapsed="0.039462">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.962617" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.962789" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.962852" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:45.920489" elapsed="0.042461">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.963122" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.963303" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.963491" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.963659" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.963827" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:45.963993" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:45.964088" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.917935" elapsed="0.046283">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:46.997862" 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-11T00:53:46.997359" elapsed="0.000537"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:46.998371" 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-11T00:53:46.998074" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:46.998472" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:53:46.998649" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:46.996939" elapsed="0.001734"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:47.003375" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:47.003185" elapsed="0.000231"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:47.003572" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:47.004127" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:47.003920" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:47.004616" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:47.004344" elapsed="0.000314"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:47.004824" elapsed="0.000185"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:47.005412" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:47.005188" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:47.005854" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:47.005611" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:47.006401" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:47.006049" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:47.006835" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:47.006601" elapsed="0.000277"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:47.007309" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:47.007030" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:47.014360" elapsed="0.000251"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:47.023539" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:47.024314" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:47.023908" elapsed="0.000433"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:47.025686" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:47.025110" elapsed="0.000731">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:47.026017" elapsed="0.000023"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:47.024559" elapsed="0.001583">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.026413" elapsed="0.000025"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.026607" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.026797" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.026984" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.027157" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.027326" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.027516" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.027692" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.027859" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.028153" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.028410" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.028613" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:47.028006" elapsed="0.000689"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:47.027930" elapsed="0.000794"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.028888" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:47.028949" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:47.023029" elapsed="0.006030">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:47.029127" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:47.011966" elapsed="0.017260">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.029426" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.033747" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.033945" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:47.034011" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:47.002644" elapsed="0.031473">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:47.034231" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:47.034276" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:47.002072" elapsed="0.032227"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:47.034582" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:47.034447" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:47.034423" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:47.035997" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:47.036691" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:47.036368" elapsed="0.000349"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:47.037618" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:47.037322" elapsed="0.000384">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:47.037768" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:47.036968" elapsed="0.000903">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.038043" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.038213" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.038406" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.038579" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.038745" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.038910" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.039074" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.039248" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.039426" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.039683" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.039854" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.040016" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:47.039554" elapsed="0.000514"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:47.039491" elapsed="0.000602"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.040232" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:47.040290" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:47.035444" elapsed="0.004964">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:47.040523" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:47.040565" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:47.034806" elapsed="0.005782"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:47.041451" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:47.040920" elapsed="0.000593">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:47.040667" elapsed="0.000946">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:47.040649" elapsed="0.000997">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:47.041692" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:47.001525" elapsed="0.040265">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.041968" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.042138" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:47.042198" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:46.998972" elapsed="0.043323">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.042480" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.042660" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.042828" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.042990" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.043157" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:47.043322" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:47.043397" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:46.996113" elapsed="0.047387">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:48.075168" 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-11T00:53:48.074685" elapsed="0.000516"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:48.075699" 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-11T00:53:48.075378" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:48.075775" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:53:48.075947" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:48.074234" elapsed="0.001738"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:48.080713" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:48.080521" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:48.080901" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:48.081572" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:48.081328" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:48.082046" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:48.081789" elapsed="0.000299"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:48.082240" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:48.082796" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:48.082591" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:48.083241" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:48.082993" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:48.083804" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:48.083455" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:48.084242" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:48.084002" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:48.084749" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:48.084460" elapsed="0.000316"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:48.091535" elapsed="0.000215"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:48.100590" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:48.101350" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:48.100965" elapsed="0.000411"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:48.102568" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:48.102015" elapsed="0.000709">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:48.102886" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:48.101617" elapsed="0.001389">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.103185" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.103361" elapsed="0.000036"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.103557" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.103732" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.103910" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.104076" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.104243" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.104429" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.104624" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.104909" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.105136" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.105330" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:48.104770" elapsed="0.000665"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:48.104698" elapsed="0.000801"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.105655" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:48.105716" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:48.100069" elapsed="0.005759">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:48.105897" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:48.089221" elapsed="0.016777">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.106175" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.110496" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.110694" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:48.110759" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:48.079964" elapsed="0.030901">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:48.110978" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:48.111021" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:48.079398" elapsed="0.031645"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:48.111245" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:48.111130" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:48.111109" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:48.112631" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:48.113298" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:48.112995" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:48.114133" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:48.113871" elapsed="0.000349">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:48.114281" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:48.113531" elapsed="0.000875">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.114585" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.114761" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.114937" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.115108" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.115314" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.115495" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.115663" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.115837" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.116002" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.116422" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.116603" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.116769" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:48.116131" elapsed="0.000691"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:48.116066" elapsed="0.000787"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.117022" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:48.117085" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:48.112071" elapsed="0.005123">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:48.117308" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:48.117352" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:48.111481" elapsed="0.005894"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:48.118045" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:48.117722" elapsed="0.000383">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:48.117504" elapsed="0.000664">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:48.117484" elapsed="0.000716">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:48.118245" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:48.078826" elapsed="0.039517">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.118539" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.118708" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:48.118769" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:48.076278" elapsed="0.042588">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.119034" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.119213" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.119436" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.119605" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.119775" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:48.119941" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:48.120003" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:48.073362" elapsed="0.046738">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:49.154145" 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-11T00:53:49.153640" elapsed="0.000540"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:49.154671" 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-11T00:53:49.154356" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:49.154747" elapsed="0.000045"/>
</return>
<msg time="2026-04-11T00:53:49.154921" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:49.153221" elapsed="0.001725"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:49.159626" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:49.159436" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:49.159807" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:49.160357" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:49.160151" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:49.160847" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:49.160590" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:49.161034" elapsed="0.000177"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:49.161585" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:49.161365" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:49.162043" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:49.161780" elapsed="0.000304"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:49.162766" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:49.162238" elapsed="0.000555"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:49.163207" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:49.162967" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:49.163707" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:49.163422" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:49.170264" elapsed="0.000225"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:49.179229" elapsed="0.000222"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:49.180008" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:49.179611" elapsed="0.000487"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:49.181251" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:49.180721" elapsed="0.000698">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:49.181581" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:49.180293" elapsed="0.001409">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.181879" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.182065" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.182247" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.182436" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.182607" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.182779" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.182946" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.183117" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.183281" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.183573" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.183801" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.183995" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:49.183439" elapsed="0.000636"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:49.183351" elapsed="0.000755"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.184249" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:49.184307" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:49.178742" elapsed="0.005685">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:49.184497" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:49.167964" elapsed="0.016631">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.184772" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.189052" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.189284" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:49.189353" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:49.158885" elapsed="0.030633">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:49.189631" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:49.189674" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:49.158314" elapsed="0.031382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:49.189901" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:49.189783" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:49.189762" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:49.191279" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:49.191962" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:49.191660" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:49.192787" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:49.192524" elapsed="0.000348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:49.192933" elapsed="0.000155"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:49.192169" elapsed="0.001010">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.193355" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.193557" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.193734" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.193905" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.194098" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.194267" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.194448" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.194624" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.194787" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.195043" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.195216" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.195379" elapsed="0.000034"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:49.194914" elapsed="0.000533"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:49.194851" elapsed="0.000621"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.195613" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:49.195672" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:49.190739" elapsed="0.005035">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:49.195922" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:49.195966" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:49.190133" elapsed="0.005855"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:49.196619" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:49.196284" elapsed="0.000408">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:49.196069" elapsed="0.000701">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:49.196051" elapsed="0.000761">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:49.196868" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:49.157743" elapsed="0.039226">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.197150" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.197320" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:49.197417" elapsed="0.000021"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:49.155247" elapsed="0.042280">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.197703" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.197888" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.198087" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.198258" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.198444" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:49.198613" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:49.198675" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:49.152414" elapsed="0.046359">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:50.232414" 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-11T00:53:50.231864" elapsed="0.000587"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:50.232936" 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-11T00:53:50.232633" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:50.233012" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:53:50.233201" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:50.231460" elapsed="0.001766"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:50.238101" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:50.237908" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:50.238283" elapsed="0.000225"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:50.238918" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:50.238703" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:50.239596" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:50.239137" elapsed="0.000504"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:50.239796" elapsed="0.000185"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:50.240344" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:50.240138" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:50.240815" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:50.240568" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:50.241351" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:50.241012" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:50.241813" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:50.241573" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:50.242296" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:50.242011" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:50.248996" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:50.258322" elapsed="0.000231"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:50.259156" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:50.258757" elapsed="0.000426"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:50.260356" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:50.259813" elapsed="0.000732">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:50.260718" elapsed="0.000023"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:50.259400" elapsed="0.001448">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.261031" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.261209" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.261406" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.261585" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.261764" elapsed="0.000025"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.261940" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.262108" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.262282" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.262469" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.262800" elapsed="0.000071"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.263087" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.263283" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:50.262614" elapsed="0.000750"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:50.262542" elapsed="0.000876"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.263567" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:50.263628" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:50.257823" elapsed="0.005918">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:50.263812" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:50.246660" elapsed="0.017254">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.264094" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.270357" elapsed="0.000054"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.270588" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:50.270686" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:50.237343" elapsed="0.033453">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:50.270928" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:50.270973" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:50.236770" elapsed="0.034226"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:50.271222" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:50.271086" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:50.271064" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:50.272678" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:50.273376" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:50.273064" elapsed="0.000354"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:50.274228" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:50.273958" elapsed="0.000360">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:50.274394" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:50.273606" elapsed="0.000897">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.274695" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.274924" elapsed="0.000026"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.275113" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.275285" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.275471" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.275640" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.275809" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.275993" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.276164" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.276442" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.276617" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.276781" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:50.276295" elapsed="0.000540"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:50.276229" elapsed="0.000632"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.277011" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:50.277073" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:50.272107" elapsed="0.005072">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:50.277292" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:50.277335" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:50.271470" elapsed="0.005888"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:50.277998" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:50.277673" elapsed="0.000387">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:50.277457" elapsed="0.000665">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:50.277438" elapsed="0.000716">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:50.278200" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:50.236183" elapsed="0.042113">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.278488" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.278686" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:50.278751" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:50.233647" elapsed="0.045202">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.279062" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.279246" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.279436" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.279602" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.279773" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:50.279944" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:50.280020" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:50.230558" elapsed="0.049563">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:51.347752" 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-11T00:53:51.347258" elapsed="0.000528"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:51.348259" 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-11T00:53:51.347961" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:51.348333" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:53:51.348524" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:51.346844" elapsed="0.001705"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:51.353213" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:51.353021" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:51.353408" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:51.353971" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:51.353760" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:51.354449" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:51.354179" elapsed="0.000313"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:51.354641" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:51.355182" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:51.354977" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:51.355654" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:51.355407" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:51.356188" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:51.355850" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:51.356633" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:51.356395" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:51.357107" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:51.356828" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:51.363826" elapsed="0.000282"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:51.372875" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:51.373640" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:51.373244" elapsed="0.000423"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:51.374799" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:51.374246" elapsed="0.000706">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:51.375112" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:51.373853" elapsed="0.001376">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.375452" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.375629" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.375804" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.375974" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.376141" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.376307" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.376487" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.376660" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.376823" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.377097" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.377325" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.377536" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:51.376964" elapsed="0.000652"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:51.376892" elapsed="0.000754"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.377792" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:51.377856" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:51.372370" elapsed="0.005593">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:51.378031" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:51.361521" elapsed="0.016608">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.378306" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.382628" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.382861" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:51.382928" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:51.352481" elapsed="0.030552">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:51.383144" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:51.383188" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:51.351914" elapsed="0.031297"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:51.383461" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:51.383325" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:51.383302" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:51.384840" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:51.385522" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:51.385203" elapsed="0.000345"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:51.386344" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:51.386075" elapsed="0.000406">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:51.386560" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:51.385732" elapsed="0.000959">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.386895" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.387073" elapsed="0.000019"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.387249" elapsed="0.000037"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.387458" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.387630" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.387796" elapsed="0.000156"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.388106" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.388278" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.388460" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.388721" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.388894" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.389057" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:51.388590" elapsed="0.000518"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:51.388526" elapsed="0.000608"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.389276" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:51.389335" elapsed="0.000061"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:51.384276" elapsed="0.005216">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:51.389603" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:51.389646" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:51.383683" elapsed="0.005985"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:51.390281" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:51.389963" elapsed="0.000379">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:51.389748" elapsed="0.000672">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:51.389730" elapsed="0.000725">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:51.390501" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:51.351350" elapsed="0.039248">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.390776" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.390950" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:51.391010" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:51.348851" elapsed="0.042256">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.391299" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.391500" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.391674" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.391838" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.392008" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:51.392173" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:51.392234" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:51.345974" elapsed="0.046357">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:52.426232" 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-11T00:53:52.425738" elapsed="0.000532"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:52.426884" 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-11T00:53:52.426582" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:52.426959" elapsed="0.000045"/>
</return>
<msg time="2026-04-11T00:53:52.427134" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:52.425324" elapsed="0.001835"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:52.431953" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:52.431745" elapsed="0.000243"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:52.432144" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:52.432719" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:52.432508" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:52.433187" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:52.432934" elapsed="0.000295"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:52.433377" elapsed="0.000369"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:52.434121" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:52.433912" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:52.434581" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:52.434318" elapsed="0.000305"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:52.435140" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:52.434789" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:52.435583" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:52.435334" elapsed="0.000294"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:52.436303" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:52.435779" elapsed="0.000565"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:52.442950" elapsed="0.000208"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:52.451997" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:52.452763" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:52.452361" elapsed="0.000428"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:52.453937" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:52.453368" elapsed="0.000733">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:52.454264" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:52.452976" elapsed="0.001420">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.454577" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.454759" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.454935" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.455107" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.455274" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.455472" elapsed="0.000063"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.455694" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.455892" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.456067" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.456347" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.456592" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.456788" elapsed="0.000030"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:52.456212" elapsed="0.000666"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:52.456136" elapsed="0.000777"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.457060" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:52.457119" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:52.451470" elapsed="0.005759">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:52.457298" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:52.440649" elapsed="0.016766">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.457606" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.462068" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.462268" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:52.462334" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:52.431183" elapsed="0.031316">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:52.462614" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:52.462659" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:52.430624" elapsed="0.032058"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:52.462884" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:52.462768" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:52.462747" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:52.464281" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:52.464963" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:52.464663" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:52.465800" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:52.465524" elapsed="0.000400">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:52.465987" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:52.465170" elapsed="0.000920">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.466267" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.466470" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.466654" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.466829" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.467000" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.467168" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.467335" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.467525" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.467693" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.467982" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.468159" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.468323" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:52.467820" elapsed="0.000556"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:52.467757" elapsed="0.000660"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.468560" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:52.468619" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:52.463701" elapsed="0.005023">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:52.468835" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:52.468879" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:52.463100" elapsed="0.005802"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:52.469635" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:52.469304" elapsed="0.000391">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:52.468981" elapsed="0.000777">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:52.468963" elapsed="0.000827">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:52.469834" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:52.430049" elapsed="0.039881">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.470107" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.470321" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:52.470404" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:52.427477" elapsed="0.043034">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.470683" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.470865" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.471038" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.471204" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.471372" elapsed="0.000034"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:52.471555" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:52.471617" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:52.424463" elapsed="0.047252">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:53.503224" 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-11T00:53:53.502746" elapsed="0.000512"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:53.503746" 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-11T00:53:53.503448" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:53.503821" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:53:53.503990" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:53.502341" elapsed="0.001674"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:53.508786" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:53.508594" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:53.508971" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:53.509541" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:53.509315" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:53.510080" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:53.509822" elapsed="0.000300"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:53.510272" elapsed="0.000197"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:53.510826" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:53.510622" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:53.511260" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:53.511019" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:53.511881" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:53.511468" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:53.512314" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:53.512078" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:53.512828" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:53.512543" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:53.519728" elapsed="0.000214"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:53.528745" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:53.529531" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:53.529120" elapsed="0.000437"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:53.530685" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:53.530136" elapsed="0.000702">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:53.531000" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:53.529743" elapsed="0.001375">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.531292" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.531486" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.531668" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.531840" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.532010" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.532175" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.532342" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.532583" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.532763" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.533040" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.533270" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.533488" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:53.532906" elapsed="0.000666"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:53.532834" elapsed="0.000768"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.533750" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:53.533810" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:53.528227" elapsed="0.005690">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:53.533986" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:53.517418" elapsed="0.016668">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.534306" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.538690" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.538892" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:53.538958" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:53.508017" elapsed="0.031048">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:53.539177" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:53.539221" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:53.507463" elapsed="0.031782"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:53.539469" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:53.539333" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:53.539312" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:53.540876" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:53.541565" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:53.541247" elapsed="0.000344"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:53.542435" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:53.542148" elapsed="0.000375">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:53.542585" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:53.541805" elapsed="0.000882">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.542862" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.543036" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.543213" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.543399" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.543571" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.543738" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.543903" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.544075" elapsed="0.000158"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.544399" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.544675" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.544850" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.545020" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:53.544543" elapsed="0.000565"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:53.544466" elapsed="0.000669"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.545283" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:53.545343" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:53.540288" elapsed="0.005176">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:53.545576" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:53.545621" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:53.539693" elapsed="0.005958"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:53.546302" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:53.545970" elapsed="0.000395">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:53.545749" elapsed="0.000697">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:53.545730" elapsed="0.000750">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:53.546526" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:53.506892" elapsed="0.039731">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.546805" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.546980" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:53.547043" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:53.504315" elapsed="0.042827">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.547315" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.547514" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.547690" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.547857" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.548030" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:53.548197" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:53.548258" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:53.501542" elapsed="0.046814">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:54.579548" 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-11T00:53:54.579061" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:54.580060" 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-11T00:53:54.579757" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:54.580136" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:53:54.580306" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:54.578669" elapsed="0.001662"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:54.585077" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:54.584880" elapsed="0.000224"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:54.585260" elapsed="0.000203"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:54.585826" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:54.585619" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:54.586298" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:54.586047" elapsed="0.000293"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:54.586504" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:54.587217" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:54.586839" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:54.587677" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:54.587429" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:54.588219" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:54.587875" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:54.588672" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:54.588432" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:54.589175" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:54.588869" elapsed="0.000332"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:54.595760" elapsed="0.000217"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:54.604770" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:54.605584" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:54.605163" elapsed="0.000446"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:54.606831" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:54.606271" elapsed="0.000713">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:54.607144" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:54.605796" elapsed="0.001464">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.607455" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.607632" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.607808" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.607979" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.608208" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.608376" elapsed="0.000035"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.608563" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.608737" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.608904" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.609191" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.609437" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.609637" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:54.609047" elapsed="0.000671"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:54.608973" elapsed="0.000776"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.609895" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:54.609955" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:54.604264" elapsed="0.005798">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:54.610132" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:54.593478" elapsed="0.016753">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.610428" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.614892" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.615091" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:54.615158" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:54.584319" elapsed="0.030945">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:54.615377" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:54.615437" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:54.583764" elapsed="0.031696"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:54.615661" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:54.615547" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:54.615526" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:54.617026" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:54.617764" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:54.617454" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:54.618605" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:54.618318" elapsed="0.000374">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:54.618755" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:54.617975" elapsed="0.000886">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.619036" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.619211" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.619403" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.619578" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.619746" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.619913" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.620080" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.620251" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.620430" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.620690" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.620868" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.621031" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:54.620560" elapsed="0.000546"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:54.620494" elapsed="0.000639"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.621276" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:54.621335" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:54.616483" elapsed="0.004970">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:54.621566" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:54.621610" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:54.615880" elapsed="0.005753"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:54.622236" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:54.621927" elapsed="0.000368">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:54.621713" elapsed="0.000643">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:54.621695" elapsed="0.000707">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:54.622449" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:54.583201" elapsed="0.039344">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.622766" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.622936" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:54.622997" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:54.580647" elapsed="0.042447">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.623264" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.623458" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.623631" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.623793" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.623960" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:54.624123" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:54.624184" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:54.577873" elapsed="0.046408">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:55.656153" 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-11T00:53:55.655661" elapsed="0.000526"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:55.656689" 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-11T00:53:55.656361" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:55.656765" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:53:55.656935" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:55.655246" elapsed="0.001714"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:55.661736" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:55.661545" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:55.661916" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:55.662489" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:55.662262" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:55.662976" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:55.662703" elapsed="0.000314"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:55.663165" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:55.663720" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:55.663514" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:55.664255" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:55.664007" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:55.664819" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:55.664480" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:55.665262" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:55.665026" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:55.665778" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:55.665492" elapsed="0.000313"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:55.672723" elapsed="0.000214"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:55.681810" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:55.682591" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:55.682174" elapsed="0.000443"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:55.683770" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:55.683209" elapsed="0.000713">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:55.684085" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:55.682804" elapsed="0.001399">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.684379" elapsed="0.000040"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.684602" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.684796" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.684970" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.685139" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.685318" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.685505" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.685680" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.685857" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.686130" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.686364" elapsed="0.000053"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.686624" elapsed="0.000025"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:55.685996" elapsed="0.000718"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:55.685925" elapsed="0.000819"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.686903" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:55.686963" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:55.681307" elapsed="0.005773">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:55.687150" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:55.670313" elapsed="0.016993">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.687511" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.691912" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.692111" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:55.692177" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:55.660970" elapsed="0.031323">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:55.692420" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:55.692465" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:55.660349" elapsed="0.032139"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:55.692736" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:55.692580" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:55.692557" elapsed="0.000245"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:55.694148" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:55.694858" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:55.694552" elapsed="0.000332"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:55.695728" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:55.695452" elapsed="0.000362">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:55.695875" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:55.695066" elapsed="0.000912">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.696153" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.696325" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.696531" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.696716" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.696883" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.697048" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.697213" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.697387" elapsed="0.001569"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.699117" elapsed="0.000054"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.699433" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.699611" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.699776" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:55.699283" elapsed="0.000547"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:55.699218" elapsed="0.000639"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.700000" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:55.700060" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:55.693581" elapsed="0.006584">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:55.700278" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:55.700322" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:55.692955" elapsed="0.007390"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:55.701009" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:55.700687" elapsed="0.000382">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:55.700444" elapsed="0.000688">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:55.700425" elapsed="0.000739">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:55.701209" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:55.659796" elapsed="0.041510">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.701502" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.701672" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:55.701733" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:55.657261" elapsed="0.044569">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.701999" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.702191" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.702363" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.702546" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.702752" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:55.702922" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:55.702984" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:55.654428" elapsed="0.048686">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:56.735449" 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-11T00:53:56.734978" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:56.735955" 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-11T00:53:56.735655" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:56.736031" elapsed="0.000038"/>
</return>
<msg time="2026-04-11T00:53:56.736199" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:56.734586" elapsed="0.001639"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:56.740986" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:56.740791" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:56.741168" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:56.741774" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:56.741562" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:56.742252" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:56.741991" elapsed="0.000304"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:56.742463" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:56.743007" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:56.742800" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:56.743468" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:56.743205" elapsed="0.000305"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:56.744007" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:56.743666" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:56.744643" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:56.744202" elapsed="0.000486"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:56.745141" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:56.744846" elapsed="0.000321"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:56.751784" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:56.760794" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:56.761613" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:56.761165" elapsed="0.000474"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:56.762768" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:56.762223" elapsed="0.000693">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:56.763076" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:56.761827" elapsed="0.001365">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.763369" elapsed="0.000039"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.763627" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.763812" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.763989" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.764162" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.764333" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.764521" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.764699" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.764866" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.765142" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.765372" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.765612" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:56.765010" elapsed="0.000685"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:56.764934" elapsed="0.000791"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.765872" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:56.765933" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:56.760287" elapsed="0.005754">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:56.766111" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:56.749494" elapsed="0.016719">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.766420" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.770751" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.770947" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:56.771013" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:56.740227" elapsed="0.030893">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:56.771232" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:56.771276" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:56.739666" elapsed="0.031634"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:56.771574" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:56.771456" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:56.771434" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:56.772957" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:56.773696" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:56.773323" elapsed="0.000400"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:56.774546" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:56.774256" elapsed="0.000378">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:56.774696" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:56.773910" elapsed="0.000889">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.774975" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.775153" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.775333" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.775528" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.775702" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.775871" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.776040" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.776214" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.776381" elapsed="0.000036"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.776815" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.777002" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.777170" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:56.776525" elapsed="0.000699"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:56.776461" elapsed="0.000791"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.777412" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:56.777473" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:56.772405" elapsed="0.005185">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:56.777704" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:56.777748" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:56.771797" elapsed="0.005974"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:56.778404" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:56.778070" elapsed="0.000399">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:56.777852" elapsed="0.000682">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:56.777834" elapsed="0.000770">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:56.778655" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:56.739091" elapsed="0.039677">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.778955" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.779131" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:56.779196" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:56.736549" elapsed="0.042749">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.779490" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.779676" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.779850" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.780021" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.780191" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:56.780359" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:56.780438" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:56.733818" elapsed="0.046720">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:57.812593" 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-11T00:53:57.812085" elapsed="0.000541"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:57.813108" 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-11T00:53:57.812809" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:57.813183" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:53:57.813354" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:57.811690" elapsed="0.001689"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:57.818175" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:57.817959" elapsed="0.000244"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:57.818358" elapsed="0.000223"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:57.818949" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:57.818740" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:57.819523" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:57.819247" elapsed="0.000318"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:57.819717" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:57.820261" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:57.820054" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:57.820731" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:57.820477" elapsed="0.000296"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:57.821271" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:57.820930" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:57.821721" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:57.821484" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:57.822441" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:57.821918" elapsed="0.000550"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:57.829092" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:57.838206" elapsed="0.000228"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:57.838976" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:57.838595" elapsed="0.000408"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:57.840141" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:57.839612" elapsed="0.000678">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:57.840475" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:57.839191" elapsed="0.001403">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.840774" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.840956" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.841136" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.841309" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.841497" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.841666" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.841833" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.842004" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.842168" elapsed="0.000076"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.842540" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.842768" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.842963" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:57.842383" elapsed="0.000661"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:57.842305" elapsed="0.000769"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.843218" elapsed="0.000063"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:57.843323" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:57.837695" elapsed="0.005754">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:57.843519" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:57.826790" elapsed="0.016828">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.843798" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.848086" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.848283" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:57.848351" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:57.817415" elapsed="0.031096">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:57.848624" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:57.848668" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:57.816839" elapsed="0.031853"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:57.848896" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:57.848782" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:57.848761" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:57.850292" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:57.850973" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:57.850673" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:57.851798" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:57.851535" elapsed="0.000348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:57.851945" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:57.851181" elapsed="0.000865">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.852217" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.852416" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.852595" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.852766" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.852970" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.853139" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.853306" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.853495" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.853661" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.854066" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.854254" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.854433" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:57.853934" elapsed="0.000553"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:57.853725" elapsed="0.000788"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.854655" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:57.854714" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:57.849727" elapsed="0.005091">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:57.854928" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:57.854975" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:57.849115" elapsed="0.005883"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:57.855624" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:57.855293" elapsed="0.000391">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:57.855078" elapsed="0.000669">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:57.855060" elapsed="0.000720">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:57.855824" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:57.816270" elapsed="0.039651">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.856100" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.856268" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:57.856329" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:57.813696" elapsed="0.042747">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.856617" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.856800" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.856971" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.857172" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.857343" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:57.857529" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:57.857590" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:57.810875" elapsed="0.046812">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:58.888412" 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-11T00:53:58.887913" elapsed="0.000535"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:58.888924" 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-11T00:53:58.888627" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:58.888999" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:53:58.889174" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:58.887514" elapsed="0.001684"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:58.895192" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:58.894930" elapsed="0.000300"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:58.895471" elapsed="0.000273"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:58.896252" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:58.895964" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:58.896929" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:58.896575" elapsed="0.000412"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:58.897204" elapsed="0.000274"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:58.897981" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:58.897695" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:58.898714" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:58.898258" elapsed="0.000519"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:58.899582" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:58.899002" elapsed="0.000608"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:58.900023" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:58.899785" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:58.900530" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:58.900220" elapsed="0.000336"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:58.907111" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:58.916128" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:58.916904" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:58.916509" elapsed="0.000421"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:58.918140" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:58.917610" elapsed="0.000681">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:58.918472" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:58.917184" elapsed="0.001442">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.918806" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.918982" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.919164" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.919333" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.919520" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.919688" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.919853" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.920022" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.920182" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.920471" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.920697" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.920890" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:58.920325" elapsed="0.000646"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:58.920252" elapsed="0.000748"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.921146" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:58.921206" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:58.915635" elapsed="0.005677">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:58.921381" elapsed="0.000032"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:58.904829" elapsed="0.016670">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.921676" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.925938" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.926135" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:53:58.926235" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:58.894120" elapsed="0.032223">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:58.926508" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:58.926553" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:58.893321" elapsed="0.033255"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:58.926818" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:53:58.926703" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T00:53:58.926682" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:58.928185" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:58.928865" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:58.928564" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:58.929689" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:58.929426" elapsed="0.000349">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:58.929837" elapsed="0.000155"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:58.929071" elapsed="0.001012">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.930256" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.930454" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.930647" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.930818" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.930984" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.931147" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.931312" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.931500" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.931664" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.931916" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.932086" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.932246" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:58.931790" elapsed="0.000507"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:58.931726" elapsed="0.000596"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.932476" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:58.932535" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:58.927648" elapsed="0.004990">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:53:58.932747" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:53:58.932826" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:58.927040" elapsed="0.005811"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:53:58.933471" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:53:58.933144" elapsed="0.000388">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:53:58.932932" elapsed="0.000662">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:53:58.932913" elapsed="0.000713">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:53:58.933671" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:58.892552" elapsed="0.041215">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.933944" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.934113" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:58.934175" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:58.889530" elapsed="0.044742">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.934460" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.934664" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.934843" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.935008" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.935175" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:58.935340" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:58.935417" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:58.886656" elapsed="0.048861">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:53:59.968210" 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-11T00:53:59.967750" elapsed="0.000492"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:53:59.968751" 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-11T00:53:59.968434" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:53:59.968827" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:53:59.969000" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:53:59.967320" elapsed="0.001705"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:53:59.973845" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:53:59.973652" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:59.974027" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:59.974608" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:59.974377" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:59.975315" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:59.974870" elapsed="0.000488"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:53:59.975530" elapsed="0.000184"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:59.976077" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:53:59.975871" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:59.976544" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:59.976276" elapsed="0.000310"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:59.977083" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:59.976741" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:53:59.977539" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:53:59.977283" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:53:59.978019" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:53:59.977736" elapsed="0.000309"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:59.984745" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:53:59.993787" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:53:59.994596" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:53:59.994156" elapsed="0.000467"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:53:59.995794" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:53:59.995243" elapsed="0.000705">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:53:59.996109" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:53:59.994844" elapsed="0.001388">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.996431" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.996613" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.996794" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.996972" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.997149" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.997322" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.997513" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.997692" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.997862" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.998136" elapsed="0.000075"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.998445" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.998646" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:53:59.998002" elapsed="0.000764"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:59.997931" elapsed="0.000868"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.998950" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:53:59.999011" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:59.993278" elapsed="0.005843">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:53:59.999192" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:53:59.982348" elapsed="0.016946">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:53:59.999499" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.003926" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.004124" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:00.004190" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:53:59.973094" elapsed="0.031203">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:00.004428" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:00.004473" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:53:59.972536" elapsed="0.031960"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:00.004701" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:00.004583" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:00.004562" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:00.006065" elapsed="0.000204"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:00.006770" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:00.006441" elapsed="0.000357"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:00.007611" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:00.007323" elapsed="0.000374">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:00.007758" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:00.006983" elapsed="0.000877">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.008033" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.008242" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.008439" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.008613" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.008783" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.008949" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.009118" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.009291" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.009472" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.009731" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.009904" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.010065" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:00.009601" elapsed="0.000517"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:00.009538" elapsed="0.000605"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.010283" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:00.010342" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:00.005523" elapsed="0.004939">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:00.010574" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:00.010618" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:00.004919" elapsed="0.005722"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:00.011267" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:00.010951" elapsed="0.000376">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:00.010723" elapsed="0.000683">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:00.010704" elapsed="0.000736">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:00.011487" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:53:59.971966" elapsed="0.039619">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.011763" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.011934" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:00.011996" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:53:59.969443" elapsed="0.042651">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.012301" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.012500" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.012673" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.012838" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.013008" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:00.013176" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:00.013238" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:53:59.966460" elapsed="0.046876">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:01.046826" 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-11T00:54:01.046311" elapsed="0.000548"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:01.047331" 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-11T00:54:01.047034" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:01.047425" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:54:01.047595" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:01.045920" elapsed="0.001700"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:01.052306" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:01.052118" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:01.052525" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:01.053086" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:01.052878" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:01.053574" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:01.053300" elapsed="0.000316"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:01.053765" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:01.054303" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:01.054100" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:01.054788" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:01.054516" elapsed="0.000314"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:01.055323" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:01.054985" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:01.055772" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:01.055536" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:01.056248" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:01.055968" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:01.063006" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:01.072081" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:01.072856" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:01.072463" elapsed="0.000419"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:01.074013" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:01.073486" elapsed="0.000680">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:01.074327" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:01.073067" elapsed="0.001398">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.074671" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.074850" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.075026" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.075196" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.075365" elapsed="0.000036"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.075552" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.075720" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.075893" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.076057" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.076329" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.076574" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.076768" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:01.076197" elapsed="0.000651"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:01.076126" elapsed="0.000752"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.077022" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:01.077082" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:01.071594" elapsed="0.005593">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:01.077255" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:01.060682" elapsed="0.016672">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.077556" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.081856" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.082091" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:01.082158" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:01.051579" elapsed="0.030684">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:01.082373" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:01.082476" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:01.051009" elapsed="0.031491"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:01.082723" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:01.082588" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:01.082567" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:01.084087" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:01.084766" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:01.084465" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:01.085587" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:01.085309" elapsed="0.000364">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:01.085735" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:01.084971" elapsed="0.000866">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.086012" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.086185" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.086362" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.086560" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.086757" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.086924" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.087090" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.087262" elapsed="0.000173"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.087590" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.087851" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.088027" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.088190" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:01.087719" elapsed="0.000524"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:01.087654" elapsed="0.000614"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.088430" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:01.088491" elapsed="0.000056"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:01.083547" elapsed="0.005094">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:01.088752" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:01.088796" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:01.082942" elapsed="0.005877"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:01.089446" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:01.089115" elapsed="0.000393">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:01.088899" elapsed="0.000672">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:01.088881" elapsed="0.000723">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:01.089648" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:01.050442" elapsed="0.039302">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.089922" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.090091" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:01.090153" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:01.047917" elapsed="0.042333">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.090440" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.090623" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.090828" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.090994" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.091164" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:01.091328" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:01.091405" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:01.045130" elapsed="0.046376">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:02.123645" 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-11T00:54:02.123160" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:02.124244" 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-11T00:54:02.123944" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:02.124320" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:54:02.124509" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:02.122767" elapsed="0.001768"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:02.129303" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:02.129115" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:02.129503" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:02.130058" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:02.129853" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:02.130565" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:02.130292" elapsed="0.000315"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:02.130756" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:02.133268" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:02.131089" elapsed="0.002206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:02.133745" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:02.133492" elapsed="0.000295"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:02.134325" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:02.133946" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:02.134783" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:02.134542" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:02.135269" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:02.134983" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:02.141914" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:02.151177" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:02.151956" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:02.151563" elapsed="0.000420"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:02.153195" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:02.152649" elapsed="0.000703">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:02.153569" elapsed="0.000025"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:02.152175" elapsed="0.001528">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.153886" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.154065" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.154243" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.154501" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.154689" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.154858" elapsed="0.000071"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.155084" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.155260" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.155459" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.155764" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.156027" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.156227" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:02.155605" elapsed="0.000704"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:02.155531" elapsed="0.000809"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.156537" elapsed="0.000026"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:02.156608" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:02.150685" elapsed="0.006032">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:02.156789" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:02.139591" elapsed="0.017298">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.157072" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.161357" elapsed="0.000087"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.161628" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:02.161695" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:02.128570" elapsed="0.033233">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:02.161916" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:02.161962" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:02.127946" elapsed="0.034039"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:02.162210" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:02.162077" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:02.162054" elapsed="0.000247"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:02.163663" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:02.164343" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:02.164035" elapsed="0.000335"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:02.165206" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:02.164936" elapsed="0.000405">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:02.165432" elapsed="0.000175"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:02.164588" elapsed="0.001113">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.165880" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.166060" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.166245" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.166482" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.166655" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.166820" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.166987" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.167159" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.167325" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.167609" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.167784" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.167948" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:02.167476" elapsed="0.000527"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:02.167407" elapsed="0.000624"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.168180" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:02.168242" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:02.163090" elapsed="0.005256">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:02.168478" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:02.168523" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:02.162484" elapsed="0.006062"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:02.169183" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:02.168856" elapsed="0.000391">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:02.168632" elapsed="0.000680">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:02.168612" elapsed="0.000733">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:02.169408" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:02.127374" elapsed="0.042138">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.169697" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.169907" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:02.169974" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:02.124837" elapsed="0.045239">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.170284" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.170513" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.170694" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.170864" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.171035" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:02.171209" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:02.171273" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:02.121959" elapsed="0.049415">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:03.204072" 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-11T00:54:03.203606" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:03.204612" 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-11T00:54:03.204289" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:03.204687" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:54:03.204859" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:03.203134" elapsed="0.001749"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:03.209730" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:03.209525" elapsed="0.000232"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:03.209913" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:03.210494" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:03.210267" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:03.210976" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:03.210720" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:03.211173" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:03.211741" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:03.211533" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:03.212454" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:03.211941" elapsed="0.000559"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:03.213198" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:03.212698" elapsed="0.000536"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:03.213751" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:03.213445" elapsed="0.000369"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:03.214278" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:03.213986" elapsed="0.000318"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:03.221007" elapsed="0.000215"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:03.230067" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:03.230841" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:03.230455" elapsed="0.000412"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:03.232021" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:03.231482" elapsed="0.000698">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:03.232347" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:03.231057" elapsed="0.001437">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.232675" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.232851" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.233028" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.233200" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.233368" elapsed="0.000036"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.233554" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.233739" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.233915" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.234081" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.234361" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.234615" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.234809" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:03.234228" elapsed="0.000661"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:03.234155" elapsed="0.000764"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.235066" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:03.235124" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:03.229538" elapsed="0.005693">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:03.235299" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:03.218650" elapsed="0.016774">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.235649" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.240000" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.240200" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:03.240267" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:03.208965" elapsed="0.031408">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:03.240512" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:03.240555" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:03.208400" elapsed="0.032178"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:03.240787" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:03.240666" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:03.240645" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:03.242180" elapsed="0.000219"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:03.242857" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:03.242557" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:03.243695" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:03.243423" elapsed="0.000359">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:03.243843" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:03.243064" elapsed="0.000882">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.244123" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.244297" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.244490" elapsed="0.000177"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.244830" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.245001" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.245167" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.245335" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.245528" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.245695" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.246157" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.246332" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.246513" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:03.246019" elapsed="0.000585"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:03.245951" elapsed="0.000680"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.246775" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:03.246834" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:03.241618" elapsed="0.005321">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:03.247050" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:03.247093" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:03.241007" elapsed="0.006108"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:03.247750" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:03.247430" elapsed="0.000381">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:03.247195" elapsed="0.000679">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:03.247177" elapsed="0.000729">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:03.247951" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:03.207830" elapsed="0.040219">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.248228" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.248412" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:03.248476" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:03.205183" elapsed="0.043393">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.248749" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.248930" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.249103" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.249272" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.249459" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:03.249626" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:03.249687" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:03.202286" elapsed="0.047521">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:04.279894" 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-11T00:54:04.279428" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:04.280426" 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-11T00:54:04.280103" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:04.280502" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:54:04.280673" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:04.279011" elapsed="0.001688"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:04.285451" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:04.285244" elapsed="0.000234"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:04.285633" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:04.286190" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:04.285980" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:04.286678" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:04.286421" elapsed="0.000300"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:04.286871" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:04.287426" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:04.287205" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:04.288059" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:04.287628" elapsed="0.000474"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:04.288623" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:04.288258" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:04.289105" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:04.288823" elapsed="0.000328"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:04.289612" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:04.289306" elapsed="0.000333"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:04.296198" elapsed="0.000226"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:04.305266" elapsed="0.000226"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:04.306042" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:04.305652" elapsed="0.000416"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:04.307204" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:04.306678" elapsed="0.000680">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:04.307538" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:04.306256" elapsed="0.001402">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.307837" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.308015" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.308192" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.308364" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.308612" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.308783" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.308955" elapsed="0.000062"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.309182" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.309351" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.309641" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.309874" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.310071" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:04.309507" elapsed="0.000647"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:04.309436" elapsed="0.000747"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.310331" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:04.310552" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:04.304749" elapsed="0.005913">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:04.310732" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:04.293911" elapsed="0.016921">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.311012" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.315313" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.315565" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:04.315632" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:04.284662" elapsed="0.031075">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:04.315849" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:04.315894" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:04.284091" elapsed="0.031826"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:04.316116" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:04.316003" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:04.315982" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:04.317530" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:04.318232" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:04.317928" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:04.319207" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:04.318800" elapsed="0.000495">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:04.319357" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:04.318460" elapsed="0.001028">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.319669" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.319844" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.320021" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.320192" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.320358" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.320542" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.320708" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.320879" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.321080" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.321341" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.321531" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.321695" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:04.321211" elapsed="0.000537"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:04.321147" elapsed="0.000627"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.321915" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:04.321973" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:04.316943" elapsed="0.005133">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:04.322186" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:04.322229" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:04.316334" elapsed="0.005917"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:04.322879" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:04.322565" elapsed="0.000373">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:04.322332" elapsed="0.000668">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:04.322313" elapsed="0.000719">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:04.323076" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:04.283537" elapsed="0.039636">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.323407" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.323581" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:04.323642" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:04.281010" elapsed="0.042731">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.323911" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.324092" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.324263" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.324443" elapsed="0.000022"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.324614" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:04.324780" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:04.324842" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:04.278219" elapsed="0.046720">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:05.357568" 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-11T00:54:05.357070" elapsed="0.000532"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:05.358078" 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-11T00:54:05.357779" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:05.358154" elapsed="0.000052"/>
</return>
<msg time="2026-04-11T00:54:05.358345" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:05.356672" elapsed="0.001698"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:05.363068" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:05.362878" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:05.363250" elapsed="0.000209"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:05.363823" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:05.363615" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:05.364543" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:05.364057" elapsed="0.000530"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:05.364738" elapsed="0.000184"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:05.365283" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:05.365078" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:05.365821" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:05.365573" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:05.366359" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:05.366018" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:05.366811" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:05.366574" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:05.367287" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:05.367007" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:05.373922" elapsed="0.000223"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:05.382999" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:05.383782" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:05.383366" elapsed="0.000443"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:05.385008" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:05.384457" elapsed="0.000703">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:05.385323" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:05.383997" elapsed="0.001470">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.385688" elapsed="0.000025"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.385871" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.386049" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.386220" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.386404" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.386576" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.386744" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.386917" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.387081" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.387358" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.387603" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.387798" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:05.387226" elapsed="0.000655"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:05.387151" elapsed="0.000759"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.388068" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:05.388130" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:05.382504" elapsed="0.005737">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:05.388309" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:05.371619" elapsed="0.016868">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.388672" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.393092" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.393292" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:05.393359" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:05.362320" elapsed="0.031202">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:05.393635" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:05.393679" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:05.361764" elapsed="0.031938"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:05.393923" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:05.393792" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:05.393770" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:05.395296" elapsed="0.000226"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:05.395981" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:05.395680" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:05.396820" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:05.396558" elapsed="0.000348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:05.396967" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:05.396203" elapsed="0.000866">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.397241" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.397436" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.397613" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.397781" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.397944" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.398105" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.398267" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.398451" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.398613" elapsed="0.000055"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.398908" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.399079" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.399240" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:05.398779" elapsed="0.000513"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:05.398714" elapsed="0.000604"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.399477" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:05.399537" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:05.394755" elapsed="0.004884">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:05.399748" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:05.399791" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:05.394141" elapsed="0.005673"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:05.400471" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:05.400134" elapsed="0.000399">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:05.399893" elapsed="0.000702">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:05.399875" elapsed="0.000752">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:05.400672" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:05.361196" elapsed="0.039573">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.400948" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.401116" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:05.401178" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:05.358689" elapsed="0.042585">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.401462" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.401643" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.401813" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.401977" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.402146" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:05.402312" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:05.402373" elapsed="0.000030"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:05.355849" elapsed="0.046674">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:06.434404" 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-11T00:54:06.433888" elapsed="0.000557"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:06.435015" 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-11T00:54:06.434685" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:06.435094" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:54:06.435276" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:06.433477" elapsed="0.001828"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:06.440272" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:06.440055" elapsed="0.000244"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:06.440479" elapsed="0.000220"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:06.441147" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:06.440867" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:06.441692" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:06.441382" elapsed="0.000354"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:06.441889" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:06.442513" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:06.442229" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:06.443018" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:06.442714" elapsed="0.000350"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:06.443655" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:06.443233" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:06.444178" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:06.443926" elapsed="0.000296"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:06.444694" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:06.444402" elapsed="0.000318"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:06.451539" elapsed="0.000214"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:06.460599" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:06.461408" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:06.460969" elapsed="0.000469"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:06.462602" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:06.462029" elapsed="0.000730">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:06.462925" elapsed="0.000048"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:06.461630" elapsed="0.001457">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.463271" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.463531" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.463714" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.463887" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.464057" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.464225" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.464410" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.464586" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.464751" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.465027" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.465258" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.465469" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:06.464894" elapsed="0.000659"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:06.464821" elapsed="0.000763"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.465731" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:06.465792" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:06.460090" elapsed="0.005808">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:06.465968" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:06.449130" elapsed="0.016937">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.466246" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.470729" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.470934" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:06.471033" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:06.439479" elapsed="0.031663">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:06.471254" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:06.471296" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:06.438830" elapsed="0.032489"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:06.471597" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:06.471472" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:06.471448" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:06.472978" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:06.473664" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:06.473342" elapsed="0.000349"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:06.474503" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:06.474214" elapsed="0.000377">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:06.474654" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:06.473875" elapsed="0.000882">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.474929" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.475124" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.475304" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.475496" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.475666" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.475834" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.476000" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.476172" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.476338" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.476765" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.476943" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.477111" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:06.476631" elapsed="0.000534"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:06.476419" elapsed="0.000772"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.477333" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:06.477409" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:06.472435" elapsed="0.005082">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:06.477631" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:06.477675" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:06.471824" elapsed="0.005874"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:06.478412" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:06.478030" elapsed="0.000447">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:06.477779" elapsed="0.000763">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:06.477761" elapsed="0.000849">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:06.478660" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:06.438249" elapsed="0.040523">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.478965" elapsed="0.000052"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.479176" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:06.479242" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:06.435627" elapsed="0.043715">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.479533" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.479732" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.479910" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.480076" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.480247" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:06.480436" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:06.480511" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:06.432615" elapsed="0.047998">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:07.512024" 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-11T00:54:07.511559" elapsed="0.000499"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:07.512544" 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-11T00:54:07.512229" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:07.512620" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:54:07.512790" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:07.511148" elapsed="0.001667"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:07.517500" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:07.517294" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:07.517711" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:07.518271" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:07.518062" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:07.518843" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:07.518584" elapsed="0.000301"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:07.519036" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:07.519601" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:07.519376" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:07.520219" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:07.519801" elapsed="0.000461"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:07.520789" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:07.520439" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:07.521227" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:07.520988" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:07.521739" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:07.521442" elapsed="0.000323"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:07.528341" elapsed="0.000228"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:07.537343" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:07.538125" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:07.537741" elapsed="0.000410"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:07.539292" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:07.538758" elapsed="0.000705">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:07.539625" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:07.538340" elapsed="0.001402">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.539921" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.540096" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.540276" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.540472" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.540660" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.540829" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.540995" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.541167" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.541337" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.541626" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.541883" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.542078" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:07.541493" elapsed="0.000664"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:07.541422" elapsed="0.000764"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.542329" elapsed="0.000053"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:07.542439" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:07.536856" elapsed="0.005702">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:07.542625" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:07.526060" elapsed="0.016664">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.542903" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.547187" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.547385" elapsed="0.000072"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:07.547503" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:07.516755" elapsed="0.030854">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:07.547720" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:07.547763" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:07.516180" elapsed="0.031605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:07.547989" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:07.547870" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:07.547849" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:07.549346" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:07.550054" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:07.549748" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:07.552812" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:07.550624" elapsed="0.002277">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:07.552964" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:07.550262" elapsed="0.002809">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.553248" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.553442" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.553621" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.553806" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.554011" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.554180" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.554348" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.554538" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.554704" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.554965" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.555138" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.555303" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:07.554833" elapsed="0.000523"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:07.554768" elapsed="0.000614"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.555542" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:07.555601" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:07.548808" elapsed="0.006897">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:07.555817" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:07.555862" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:07.548207" elapsed="0.007679"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:07.556550" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:07.556209" elapsed="0.000402">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:07.555989" elapsed="0.000685">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:07.555968" elapsed="0.000738">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:07.556751" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:07.515632" elapsed="0.041214">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.557022" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.557188" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:07.557249" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:07.513115" elapsed="0.044231">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.557531" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.557710" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.557936" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.558140" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.558307" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:07.558487" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:07.558549" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:07.510329" elapsed="0.048318">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:08.590939" 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-11T00:54:08.590452" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:08.591472" 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-11T00:54:08.591152" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:08.591551" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:54:08.591726" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:08.590029" elapsed="0.001724"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:08.596666" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:08.596426" elapsed="0.000271"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:08.596870" elapsed="0.000220"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:08.597503" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:08.597261" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:08.597987" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:08.597731" elapsed="0.000299"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:08.598184" elapsed="0.000439"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:08.599002" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:08.598788" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:08.599493" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:08.599201" elapsed="0.000337"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:08.600045" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:08.599698" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:08.600532" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:08.600249" elapsed="0.000327"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:08.601016" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:08.600732" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:08.607710" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:08.617101" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:08.617898" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:08.617497" elapsed="0.000428"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:08.619156" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:08.618621" elapsed="0.000688">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:08.619511" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:08.618183" elapsed="0.001453">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.619818" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.619997" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.620175" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.620414" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.620614" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.620782" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.620952" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.621124" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.621289" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.621582" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.621813" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.622009" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:08.621445" elapsed="0.000646"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:08.621359" elapsed="0.000762"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.622268" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:08.622329" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:08.616580" elapsed="0.005875">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:08.622534" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:08.605416" elapsed="0.017218">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.622814" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.627191" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.627454" elapsed="0.000027"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:08.627565" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:08.595790" elapsed="0.031886">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:08.627792" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:08.627837" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:08.595204" elapsed="0.032657"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:08.628071" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:08.627950" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:08.627928" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:08.629571" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:08.630243" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:08.629942" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:08.631239" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:08.630823" elapsed="0.000506">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:08.631415" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:08.630470" elapsed="0.001054">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.631704" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.631879" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.632057" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.632229" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.632490" elapsed="0.000037"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.632687" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.632858" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.633032" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.633199" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.633477" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.633657" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.633824" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:08.633328" elapsed="0.000549"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:08.633263" elapsed="0.000639"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.634049" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:08.634109" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:08.629007" elapsed="0.005209">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:08.634330" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:08.634433" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:08.628295" elapsed="0.006164"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:08.635092" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:08.634766" elapsed="0.000388">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:08.634543" elapsed="0.000674">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:08.634524" elapsed="0.000726">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:08.635297" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:08.594643" elapsed="0.040774">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.635600" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.635771" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:08.635833" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:08.592058" elapsed="0.043875">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.636107" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.636290" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.636519" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.636689" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.636859" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:08.637024" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:08.637084" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:08.589217" elapsed="0.047970">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:09.669624" 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-11T00:54:09.669125" elapsed="0.000534"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:09.670172" 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-11T00:54:09.669839" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:09.670248" elapsed="0.000046"/>
</return>
<msg time="2026-04-11T00:54:09.670449" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:09.668728" elapsed="0.001746"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:09.675300" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:09.675112" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:09.675500" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:09.676062" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:09.675849" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:09.676562" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:09.676282" elapsed="0.000321"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:09.676756" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:09.677530" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:09.677096" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:09.677982" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:09.677734" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:09.678541" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:09.678182" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:09.678992" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:09.678752" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:09.679487" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:09.679189" elapsed="0.000324"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:09.686079" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:09.695113" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:09.695877" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:09.695492" elapsed="0.000411"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:09.697043" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:09.696511" elapsed="0.000685">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:09.697356" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:09.696092" elapsed="0.001404">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.697678" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.697856" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.698035" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.698207" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.698374" elapsed="0.000036"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.698563" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.698732" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.698930" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.699100" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.699398" elapsed="0.000059"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.699670" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.699868" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:09.699245" elapsed="0.000704"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:09.699170" elapsed="0.000809"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.700125" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:09.700185" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:09.694613" elapsed="0.005679">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:09.700359" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:09.683794" elapsed="0.016690">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.700664" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.705049" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.705246" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:09.705311" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:09.674540" elapsed="0.030932">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:09.705586" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:09.705629" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:09.673963" elapsed="0.031689"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:09.705854" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:09.705737" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:09.705716" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:09.707246" elapsed="0.000222"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:09.707928" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:09.707626" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:09.708902" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:09.708492" elapsed="0.000498">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:09.709052" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:09.708137" elapsed="0.001020">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.709333" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.709571" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.709753" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.709928" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.710098" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.710265" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.710449" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.710625" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.710790" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.711061" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.711233" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.711410" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:09.710931" elapsed="0.000533"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:09.710866" elapsed="0.000624"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.711633" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:09.711691" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:09.706677" elapsed="0.005117">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:09.711904" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:09.711948" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:09.706075" elapsed="0.005895"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:09.712604" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:09.712266" elapsed="0.000399">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:09.712051" elapsed="0.000675">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:09.712033" elapsed="0.000725">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:09.712803" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:09.673407" elapsed="0.039493">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.713078" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.713247" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:09.713308" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:09.670887" elapsed="0.042535">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.713636" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.713817" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.713990" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.714154" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.714328" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:09.714513" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:09.714574" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:09.667898" elapsed="0.046774">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:10.747855" 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-11T00:54:10.747336" elapsed="0.000557"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:10.748380" 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-11T00:54:10.748078" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:10.748472" elapsed="0.000046"/>
</return>
<msg time="2026-04-11T00:54:10.748651" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:10.746927" elapsed="0.001749"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:10.753439" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:10.753219" elapsed="0.000247"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:10.753622" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:10.754185" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:10.753969" elapsed="0.000242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:10.754904" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:10.754423" elapsed="0.000523"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:10.755098" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:10.755660" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:10.755451" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:10.756102" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:10.755858" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:10.756670" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:10.756298" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:10.757138" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:10.756867" elapsed="0.000319"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:10.757648" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:10.757347" elapsed="0.000327"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:10.764219" elapsed="0.000335"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:10.773365" elapsed="0.000236"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:10.774146" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:10.773760" elapsed="0.000412"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:10.775365" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:10.774836" elapsed="0.000709">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:10.775726" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:10.774374" elapsed="0.001494">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.776091" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.776272" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.776472" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.776646" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.776814" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.776980" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.777231" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.777447" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.777617" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.777900" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.778172" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.778396" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:10.777765" elapsed="0.000726"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:10.777688" elapsed="0.000831"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.778670" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:10.778730" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:10.772845" elapsed="0.005991">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:10.778905" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:10.761942" elapsed="0.017062">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.779210" elapsed="0.000024"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.783757" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.783995" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:10.784063" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:10.752634" elapsed="0.031543">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:10.784289" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:10.784332" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:10.752061" elapsed="0.032294"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:10.784582" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:10.784461" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:10.784439" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:10.785985" elapsed="0.000204"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:10.786673" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:10.786345" elapsed="0.000354"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:10.787512" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:10.787221" elapsed="0.000378">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:10.787661" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:10.786881" elapsed="0.000883">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.787935" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.788106" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.788279" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.788464" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.788633" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.788796" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.788960" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.789128" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.789307" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.789591" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.789761" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.789928" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:10.789460" elapsed="0.000519"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:10.789376" elapsed="0.000628"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.790143" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:10.790200" elapsed="0.000050"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:10.785437" elapsed="0.004906">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:10.790471" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:10.790514" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:10.784801" elapsed="0.005735"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:10.791139" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:10.790828" elapsed="0.000375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:10.790616" elapsed="0.000650">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:10.790598" elapsed="0.000700">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:10.791342" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:10.751508" elapsed="0.039948">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.791634" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.791802" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:10.791862" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:10.748979" elapsed="0.042980">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.792130" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.792345" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.792579" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.792747" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.792917" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:10.793083" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:10.793143" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:10.745923" elapsed="0.047370">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:11.827896" 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-11T00:54:11.827401" elapsed="0.000528"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:11.828492" 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-11T00:54:11.828178" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:11.828568" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:54:11.828742" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:11.826934" elapsed="0.001832"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:11.833444" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:11.833241" elapsed="0.000230"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:11.833627" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:11.834184" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:11.833978" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:11.834682" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:11.834419" elapsed="0.000305"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:11.834874" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:11.835453" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:11.835209" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:11.835898" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:11.835652" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:11.836445" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:11.836092" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:11.836874" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:11.836641" elapsed="0.000276"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:11.837349" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:11.837070" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:11.844100" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:11.853114" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:11.853889" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:11.853501" elapsed="0.000414"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:11.855058" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:11.854525" elapsed="0.000688">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:11.855399" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:11.854104" elapsed="0.001424">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.855706" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.855883" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.856059" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.856231" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.856421" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.856590" elapsed="0.000056"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.856800" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.856974" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.857140" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.857433" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.857663" elapsed="0.000026"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.857862" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:11.857280" elapsed="0.000663"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:11.857208" elapsed="0.000764"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.858117" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:11.858176" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:11.852623" elapsed="0.005659">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:11.858350" elapsed="0.000018"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:11.841767" elapsed="0.016703">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.858648" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.862917" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.863115" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:11.863181" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:11.832700" elapsed="0.030587">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:11.863465" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:11.863511" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:11.832113" elapsed="0.031421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:11.863742" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:11.863622" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:11.863601" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:11.865133" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:11.865818" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:11.865517" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:11.866640" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:11.866363" elapsed="0.000405">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:11.866831" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:11.866025" elapsed="0.000909">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.867108" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.867280" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.867501" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.867674" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.867839" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.868002" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.868174" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.868344" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.868535" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.868939" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.869114" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.869278" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:11.868805" elapsed="0.000525"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:11.868598" elapsed="0.000758"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.869516" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:11.869575" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:11.864592" elapsed="0.005087">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:11.869788" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:11.869831" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:11.863978" elapsed="0.005877"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:11.870496" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:11.870158" elapsed="0.000398">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:11.869933" elapsed="0.000686">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:11.869915" elapsed="0.000735">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:11.870695" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:11.831564" elapsed="0.039228">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.870969" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.871174" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:11.871238" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:11.829064" elapsed="0.042273">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.871534" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.871716" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.871886" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.872050" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.872219" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:11.872397" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:11.872460" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:11.826144" elapsed="0.046416">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:12.903886" 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-11T00:54:12.903418" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:12.904412" 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-11T00:54:12.904097" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:12.904488" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:54:12.904660" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:12.903010" elapsed="0.001675"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:12.909337" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:12.909151" elapsed="0.000212"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:12.909556" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:12.910118" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:12.909913" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:12.910602" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:12.910332" elapsed="0.000311"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:12.910793" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:12.911328" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:12.911125" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:12.911960" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:12.911539" elapsed="0.000463"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:12.912600" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:12.912158" elapsed="0.000469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:12.913039" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:12.912801" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:12.913569" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:12.913240" elapsed="0.000356"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:12.920134" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:12.929116" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:12.929905" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:12.929517" elapsed="0.000415"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:12.931093" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:12.930559" elapsed="0.000685">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:12.931425" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:12.930117" elapsed="0.001426">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.931720" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.931895" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.932072" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.932242" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.932428" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.932595" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.932760" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.932932" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.933098" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.933367" elapsed="0.000034"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.933636" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.933830" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:12.933236" elapsed="0.000673"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:12.933167" elapsed="0.000772"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.934083" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:12.934142" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:12.928624" elapsed="0.005623">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:12.934315" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:12.917853" elapsed="0.016581">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.934656" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.938946" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.939142" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:12.939209" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:12.908614" elapsed="0.030700">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:12.939439" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:12.939484" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:12.908048" elapsed="0.031459"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:12.939706" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:12.939593" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:12.939572" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:12.941066" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:12.941778" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:12.941443" elapsed="0.000361"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:12.942756" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:12.942325" elapsed="0.000518">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:12.942904" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:12.941988" elapsed="0.001019">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.943182" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.943359" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.943556" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.943730" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.943898" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.944065" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.944231" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.944419" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.944586" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.944838" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.945011" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.945175" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:12.944709" elapsed="0.000552"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:12.944647" elapsed="0.000642"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.945448" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:12.945523" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:12.940527" elapsed="0.005099">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:12.945735" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:12.945777" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:12.939925" elapsed="0.005875"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:12.946426" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:12.946092" elapsed="0.000397">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:12.945879" elapsed="0.000672">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:12.945861" elapsed="0.000723">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:12.946629" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:12.907498" elapsed="0.039226">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.946902" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.947070" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:12.947132" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:12.904985" elapsed="0.042244">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.947415" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.947598" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.947772" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.947935" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.948103" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:12.948267" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:12.948327" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:12.902219" elapsed="0.046224">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:13.979586" 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-11T00:54:13.979020" elapsed="0.000601"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:13.980099" 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-11T00:54:13.979799" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:13.980176" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:54:13.980350" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:13.978617" elapsed="0.001759"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:13.987352" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:13.987161" elapsed="0.000231"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:13.987561" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:13.988116" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:13.987910" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:13.988606" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:13.988331" elapsed="0.000317"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:13.988798" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:13.989336" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:13.989131" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:13.989850" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:13.989599" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:13.990417" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:13.990046" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:13.990854" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:13.990620" elapsed="0.000277"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:13.991328" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:13.991049" elapsed="0.000304"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:13.997951" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:14.007050" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:14.007885" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:14.007442" elapsed="0.000470"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:14.009070" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:14.008530" elapsed="0.000694">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:14.009407" elapsed="0.000028"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:14.008109" elapsed="0.001432">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.009720" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.009897" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.010077" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.010250" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.010510" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.010680" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.010850" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.011025" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.011192" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.011510" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.011745" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.011941" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:14.011336" elapsed="0.000686"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:14.011263" elapsed="0.000788"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.012198" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:14.012257" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:14.006545" elapsed="0.005819">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:14.012461" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:13.995670" elapsed="0.016893">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.012743" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.017342" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.017613" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:14.017680" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:13.986624" elapsed="0.031163">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:14.017903" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:14.017947" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:13.986017" elapsed="0.031952"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:14.018197" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:14.018061" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:14.018039" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:14.019676" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:14.020427" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:14.020085" elapsed="0.000377"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:14.021277" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:14.021010" elapsed="0.000365">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:14.021503" elapsed="0.000023"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:14.020653" elapsed="0.000976">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.021807" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.021983" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.022163" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.022336" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.022559" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.022726" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.022893" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.023066" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.023232" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.023547" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.023731" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.023899" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:14.023365" elapsed="0.000589"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:14.023297" elapsed="0.000684"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.024124" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:14.024184" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:14.019096" elapsed="0.005193">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:14.024419" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:14.024465" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:14.018438" elapsed="0.006051"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:14.025135" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:14.024792" elapsed="0.000420">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:14.024572" elapsed="0.000708">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:14.024553" elapsed="0.000772">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:14.025374" elapsed="0.000038"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:13.985461" elapsed="0.040057">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.025752" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.025929" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:14.025991" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:13.980697" elapsed="0.045393">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.026264" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.026513" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.026703" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.026871" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.027044" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:14.027236" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:14.027303" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:13.977725" elapsed="0.049693">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:15.060158" 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-11T00:54:15.059696" elapsed="0.000496"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:15.060674" 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-11T00:54:15.060364" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:15.060748" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:54:15.060916" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:15.059283" elapsed="0.001658"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:15.065671" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:15.065479" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:15.065867" elapsed="0.000198"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:15.066445" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:15.066220" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:15.066916" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:15.066663" elapsed="0.000295"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:15.067109" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:15.067675" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:15.067465" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:15.068220" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:15.067971" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:15.068778" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:15.068435" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:15.069212" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:15.068976" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:15.069754" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:15.069456" elapsed="0.000325"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:15.076532" elapsed="0.000215"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:15.085772" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:15.086585" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:15.086142" elapsed="0.000470"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:15.087824" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:15.087260" elapsed="0.000716">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:15.088148" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:15.086804" elapsed="0.001464">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.088472" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.088652" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.088831" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.089003" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.089171" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.089339" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.089557" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.089732" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.089898" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.090169" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.090418" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.090622" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:15.090038" elapsed="0.000816"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:15.089966" elapsed="0.000917"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.091029" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:15.091088" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:15.085235" elapsed="0.005959">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:15.091264" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:15.074222" elapsed="0.017202">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.091609" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.096117" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.096324" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:15.096410" elapsed="0.000019"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:15.064897" elapsed="0.031628">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:15.096641" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:15.096685" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:15.064326" elapsed="0.032382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:15.096923" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:15.096798" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:15.096776" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:15.098409" elapsed="0.000219"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:15.099148" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:15.098790" elapsed="0.000385"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:15.099988" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:15.099722" elapsed="0.000357">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:15.100141" elapsed="0.000057"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:15.099362" elapsed="0.000925">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.100482" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.100662" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.100839" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.101011" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.101180" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.101346" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.101550" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.101726" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.101893" elapsed="0.000059"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.102200" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.102374" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.102558" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:15.102066" elapsed="0.000547"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:15.102000" elapsed="0.000638"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.102782" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:15.102841" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:15.097835" elapsed="0.005109">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:15.103056" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:15.103099" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:15.097145" elapsed="0.005976"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:15.103945" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:15.103432" elapsed="0.000574">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:15.103202" elapsed="0.000868">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:15.103183" elapsed="0.000919">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:15.104147" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:15.063777" elapsed="0.040470">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.104444" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.104617" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:15.104679" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:15.061241" elapsed="0.043538">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.104953" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.105132" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.105305" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.105538" elapsed="0.000024"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.105720" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:15.105890" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:15.105951" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:15.058497" elapsed="0.047597">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.137819" 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-11T00:54:16.137189" elapsed="0.000667"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.138346" 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-11T00:54:16.138042" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:16.138441" elapsed="0.000049"/>
</return>
<msg time="2026-04-11T00:54:16.138626" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:54:16.136705" elapsed="0.001946"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:54:16.143812" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:54:16.143570" elapsed="0.000270"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:16.144004" elapsed="0.000199"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:16.144654" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:16.144398" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.145206" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:16.144926" elapsed="0.000323"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:54:16.145420" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:16.145972" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:54:16.145764" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.146489" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:16.146203" elapsed="0.000331"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.147126" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:16.146726" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.147664" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:54:16.147365" elapsed="0.000347"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.148226" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:16.147895" elapsed="0.000357"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:16.155284" elapsed="0.000246"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:16.164520" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.165286" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:16.164890" elapsed="0.000422"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:16.166512" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.165948" elapsed="0.000749">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.166866" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.165531" elapsed="0.001464">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.167177" elapsed="0.000039"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.167461" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.167653" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.167828" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.168001" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.168172" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.168341" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.168559" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.168729" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.169011" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.169244" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.169458" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:16.168877" elapsed="0.000665"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.168801" elapsed="0.000772"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.169722" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.169781" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.164012" elapsed="0.005878">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.169959" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.152881" elapsed="0.017178">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.170239" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.174755" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.174975" elapsed="0.000024"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.175045" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.142810" elapsed="0.032344">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:16.175291" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:16.175336" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:16.142145" elapsed="0.033214"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.175658" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:16.175523" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:16.175497" elapsed="0.000245"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:54:16.177092" elapsed="0.000217"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.177811" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:54:16.177492" elapsed="0.000344"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:54:16.178685" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.178409" elapsed="0.000383">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.178866" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.178024" elapsed="0.000950">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.179152" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.179416" elapsed="0.000030"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.179645" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.179819" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.180022" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.180197" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.180371" elapsed="0.000044"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.180586" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.180757" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.181182" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.181363" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.181551" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:54:16.180890" elapsed="0.000715"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.180823" elapsed="0.000809"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.181775" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.181834" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.176542" elapsed="0.005398">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:54:16.182053" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:54:16.182098" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:16.175904" elapsed="0.006217"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.182780" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.182450" elapsed="0.000392">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:54:16.182202" elapsed="0.000703">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:54:16.182183" elapsed="0.000802">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.183037" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.141585" elapsed="0.041553">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.183353" elapsed="0.000047"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.183615" elapsed="0.000031"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.183702" elapsed="0.000024"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:54:16.138955" elapsed="0.044881">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.184035" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.184223" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.184435" elapsed="0.000029"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.184626" elapsed="0.000028"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.184835" elapsed="0.000026"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.185056" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.185138" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.135806" elapsed="0.049465">Could not parse owner and candidates for device openflow:1</status>
</kw>
<msg time="2026-04-11T00:54:16.185429" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.893793" elapsed="30.291758">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.185652" elapsed="0.000021"/>
</return>
<var>${original_owner}</var>
<var>${original_successor_list}</var>
<arg>openflow:1</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.891161" elapsed="30.294621">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.186024" elapsed="0.000027"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_cluster_list}</arg>
<arg>${original_successor_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.186259" elapsed="0.000027"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor for first switch s1.</doc>
<status status="FAIL" start="2026-04-11T00:53:45.869670" elapsed="30.316817">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</test>
<test id="s1-s4-t9" name="Disconnect Mininet From Owner" line="80">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:54:16.190218" elapsed="0.000246"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:54:16.189952" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.191588" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:16.191471" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:16.191451" elapsed="0.000206"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.196755" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:16.196642" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:16.196619" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.197898" 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-11T00:54:16.197502" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.198467" 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-11T00:54:16.198135" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:16.198539" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:54:16.198699" 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-11T00:54:16.197069" elapsed="0.001655"/>
</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-11T00:54:16.199077" 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-11T00:54:16.199348" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:16.199174" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:16.199157" elapsed="0.000291"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:54:16.198931" elapsed="0.000543"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.198777" elapsed="0.000728"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:54:16.196211" elapsed="0.003347"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:54:16.191138" elapsed="0.008473"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:16.190673" elapsed="0.008982"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:54:16.187615" elapsed="0.012092"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.204278" level="FAIL">Variable '${original_owner}' not found.</msg>
<var>${original_owner_list}</var>
<arg>${original_owner}</arg>
<doc>Returns a list containing given items.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.199867" elapsed="0.004454">Variable '${original_owner}' not found.</status>
</kw>
<kw name="Disconnect Cluster Mininet" owner="MininetKeywords">
<arg>break</arg>
<arg>${original_owner_list}</arg>
<doc>Break and restore controller to mininet connection via iptables.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.204619" elapsed="0.000026"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_owner_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:16.204809" elapsed="0.000020"/>
</kw>
<doc>Disconnect mininet from the owner</doc>
<status status="FAIL" start="2026-04-11T00:54:16.186968" elapsed="0.017984">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s4-t10" name="Check Entity Owner Status And Find Owner and Successor After Fail" line="86">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:54:16.208281" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:54:16.208021" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.209529" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:16.209420" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:16.209399" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.214338" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:16.214233" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:16.214216" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.215428" 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-11T00:54:16.215013" elapsed="0.000443"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:16.215946" 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-11T00:54:16.215660" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:16.216016" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:54:16.216165" 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-11T00:54:16.214645" elapsed="0.001544"/>
</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-11T00:54:16.216539" 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-11T00:54:16.216778" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:16.216635" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:16.216619" elapsed="0.000234"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:54:16.216395" elapsed="0.000481"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:16.216238" elapsed="0.000662"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:54:16.213884" elapsed="0.003067"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:54:16.209122" elapsed="0.007882"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:16.208712" elapsed="0.008335"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:54:16.205734" elapsed="0.011364"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:54:16.229453" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.225484" elapsed="0.004007">Variable '${new_cluster_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:54:17.245756" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:54:17.241694" elapsed="0.004114">Variable '${new_cluster_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:54:18.263353" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:54:18.259288" elapsed="0.004130">Variable '${new_cluster_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:54:19.280701" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:54:19.276612" elapsed="0.004142">Variable '${new_cluster_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:54:20.298715" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:54:20.294610" elapsed="0.004158">Variable '${new_cluster_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:54:21.316038" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:54:21.311992" elapsed="0.004100">Variable '${new_cluster_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:54:22.333284" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:54:22.329226" elapsed="0.004110">Variable '${new_cluster_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:54:23.350114" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:54:23.346052" elapsed="0.004118">Variable '${new_cluster_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:54:24.369189" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:54:24.364069" elapsed="0.005176">Variable '${new_cluster_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:54:25.388031" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:54:25.383515" elapsed="0.004588">Variable '${new_cluster_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:54:26.405789" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:54:26.401711" elapsed="0.004132">Variable '${new_cluster_list}' not found.</status>
</kw>
<msg time="2026-04-11T00:54:26.405962" level="FAIL">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Variable '${new_cluster_list}' not found.</msg>
<var>${new_owner}</var>
<var>${new_successor_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device</arg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.217263" elapsed="10.188849">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Variable '${new_cluster_list}' not found.</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${owner_list}</var>
<arg>${original_owner}</arg>
<arg>${new_owner}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.406333" elapsed="0.000023"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${owner_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.406548" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.406719" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_successor_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.406887" elapsed="0.000019"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor for first switch s1.</doc>
<status status="FAIL" start="2026-04-11T00:54:16.205145" elapsed="10.201918">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s4-t11" name="Check Switch Moves To New Master" line="101">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:54:26.410586" elapsed="0.000270"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:54:26.410284" elapsed="0.000629"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:54:26.411995" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:26.411854" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:26.411828" elapsed="0.000243"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:54:26.417161" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:26.417053" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:26.417034" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:26.418301" 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-11T00:54:26.417905" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:26.418808" 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-11T00:54:26.418513" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:26.418885" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:54:26.419055" 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-11T00:54:26.417478" elapsed="0.001604"/>
</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-11T00:54:26.419471" 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-11T00:54:26.419742" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:26.419577" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:26.419556" elapsed="0.000267"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:54:26.419305" elapsed="0.000543"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:26.419146" elapsed="0.000730"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:54:26.416667" elapsed="0.003263"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:54:26.411538" elapsed="0.008448"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:26.411066" elapsed="0.009031"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:54:26.407941" elapsed="0.012214"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:26.424265" level="FAIL">Variable '${new_owner}' not found.</msg>
<var>${new_master}</var>
<arg>${ODL_SYSTEM_${new_owner}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="FAIL" start="2026-04-11T00:54:26.420322" elapsed="0.003982">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>OvsManager.Should Be Master</arg>
<arg>s1</arg>
<arg>${new_master}</arg>
<arg>update_data=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.424494" elapsed="0.000023"/>
</kw>
<doc>Check switch s1 is connected to new Master.</doc>
<status status="FAIL" start="2026-04-11T00:54:26.407442" elapsed="0.017211">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s4-t12" name="Check Linear Topology After Disconnect" line="112">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:54:26.427847" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:54:26.427585" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:54:26.429129" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:26.429005" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:26.428953" elapsed="0.000249"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:54:26.434114" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:26.434008" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:26.433990" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:26.435211" 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-11T00:54:26.434838" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:26.435708" 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-11T00:54:26.435423" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:26.435783" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:54:26.435935" 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-11T00:54:26.434453" elapsed="0.001506"/>
</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-11T00:54:26.436298" 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-11T00:54:26.436557" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:26.436408" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:26.436376" elapsed="0.000257"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:54:26.436156" elapsed="0.000500"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:26.436009" elapsed="0.000671"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:54:26.433642" elapsed="0.003089"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:54:26.428690" elapsed="0.008096"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:26.428257" elapsed="0.008572"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:54:26.425477" elapsed="0.011401"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:26.438837" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:26.438543" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:26.438909" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:54:26.439055" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:26.438183" elapsed="0.000896"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:26.439491" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:26.439237" elapsed="0.000635">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.440126" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.440544" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.440733" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.440916" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.441145" elapsed="0.000023"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.441335" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.441551" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.441803" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:26.441640" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:26.441623" elapsed="0.000261"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.442094" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:26.441936" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:26.441921" elapsed="0.000249"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:26.442393" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:26.442222" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:26.442207" elapsed="0.000264"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:26.440370" elapsed="0.002123"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:26.440196" elapsed="0.002322"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:26.437806" elapsed="0.004805">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:27.446645" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:27.445809" elapsed="0.000908"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:27.446836" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:54:27.447192" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:27.444972" elapsed="0.002276"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:27.451788" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:27.447639" elapsed="0.004987">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:27.453207" elapsed="0.000070"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:27.454419" elapsed="0.000058"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:27.454815" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:27.455001" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:27.455204" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:27.455410" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:27.455599" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:27.455872" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:27.455692" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:27.455672" elapsed="0.000284"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:27.456180" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:27.456011" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:27.455995" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:27.456651" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:27.456440" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:27.456417" elapsed="0.000335"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:27.453951" elapsed="0.002831"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:27.453452" elapsed="0.003366"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:27.443935" elapsed="0.013012">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:28.461065" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:28.460249" elapsed="0.000889"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:28.461260" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:54:28.461659" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:28.459441" elapsed="0.002274"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:28.462651" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:28.462067" elapsed="0.001442">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:28.463986" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:28.464937" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:28.465360" elapsed="0.000073"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:28.465801" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:28.466209" elapsed="0.000043"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:28.466643" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:28.467053" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:28.467707" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:28.467315" elapsed="0.000515"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:28.467271" elapsed="0.000592"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:28.468072" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:28.467915" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:28.467900" elapsed="0.000249"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:28.468356" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:28.468199" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:28.468184" elapsed="0.000264"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:28.464585" elapsed="0.003885"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:28.464148" elapsed="0.004357"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:28.458268" elapsed="0.010368">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:29.471300" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:29.470813" elapsed="0.000534"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:29.471448" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:54:29.471678" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:29.470274" elapsed="0.001439"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:29.472321" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:29.471933" elapsed="0.000917">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:29.473147" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:29.473837" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:29.474108" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:29.474367" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:29.474646" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:29.474905" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:29.475166" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:29.475844" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:29.475603" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:29.475265" elapsed="0.000694"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:29.476305" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:29.476034" elapsed="0.000376"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:29.476012" elapsed="0.000434"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:29.476755" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:29.476524" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:29.476502" elapsed="0.000355"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:29.473618" elapsed="0.003264"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:29.473336" elapsed="0.003573"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:29.469601" elapsed="0.007405">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:30.481055" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:30.480278" elapsed="0.000847"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:30.481278" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:54:30.481680" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:30.479475" elapsed="0.002263"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:30.482730" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:30.482096" elapsed="0.001426">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:30.483983" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:30.484925" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:30.485444" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:30.485856" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:30.486040" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:30.486220" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:30.486417" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:30.486678" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:30.486513" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:30.486492" elapsed="0.000266"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:30.486970" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:30.486810" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:30.486795" elapsed="0.000251"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:30.487257" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:30.487097" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:30.487082" elapsed="0.000345"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:30.484574" elapsed="0.002875"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:30.484142" elapsed="0.003335"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:30.478377" elapsed="0.009200">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:31.491644" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:31.490855" elapsed="0.000860"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:31.491835" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:54:31.492192" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:31.489968" elapsed="0.002283"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:31.493346" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:31.492641" elapsed="0.001565">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:31.494717" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:31.495465" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:31.495734" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:31.495995" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:31.496256" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:31.496533" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:31.496797" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:31.497154" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:31.496924" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:31.496896" elapsed="0.000367"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:31.497581" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:31.497337" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:31.497315" elapsed="0.000377"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:31.497987" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:31.497763" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:31.497743" elapsed="0.000351"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:31.495224" elapsed="0.002938"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:31.494892" elapsed="0.003308"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:31.488878" elapsed="0.009459">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:32.502888" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:32.502134" elapsed="0.000821"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:32.503109" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:54:32.503497" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:32.501320" elapsed="0.002233"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:32.504512" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:32.503902" elapsed="0.001434">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:32.505863" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:32.506864" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:32.507412" elapsed="0.000053"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:32.507941" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:32.508129" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:32.508323" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:32.508529" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:32.508791" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:32.508623" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:32.508603" elapsed="0.000268"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:32.509090" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:32.508925" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:32.508909" elapsed="0.000259"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:32.509396" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:32.509220" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:32.509204" elapsed="0.000271"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:32.506492" elapsed="0.003007"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:32.506030" elapsed="0.003495"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:32.500312" elapsed="0.009309">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:33.513619" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:33.512832" elapsed="0.000857"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:33.513808" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:54:33.514163" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:33.511917" elapsed="0.002304"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:33.515167" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:33.514615" elapsed="0.001385">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:33.516501" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:33.517445" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:33.517882" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:33.518303" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:33.518754" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:33.519174" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:33.519622" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:33.520239" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:33.519822" elapsed="0.000541"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:33.519781" elapsed="0.000669"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:33.520938" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:33.520577" elapsed="0.000420"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:33.520541" elapsed="0.000480"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:33.521234" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:33.521073" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:33.521058" elapsed="0.000254"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:33.517069" elapsed="0.004266"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:33.516663" elapsed="0.004789"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:33.510890" elapsed="0.010665">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:34.526552" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:34.525725" elapsed="0.000911"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:34.526757" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:54:34.527142" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:34.524726" elapsed="0.002473"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:34.528330" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:34.527768" elapsed="0.001369">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:34.529626" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:34.530563" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:34.530995" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:34.531447" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:34.531873" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:34.532293" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:34.532744" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:34.533417" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:34.532994" elapsed="0.000582"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:34.532948" elapsed="0.000685"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:34.534079" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:34.533759" elapsed="0.000378"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:34.533723" elapsed="0.000438"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:34.534377" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:34.534215" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:34.534199" elapsed="0.000273"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:34.530183" elapsed="0.004313"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:34.529788" elapsed="0.004734"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:34.522964" elapsed="0.011657">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:35.538577" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:35.537794" elapsed="0.000853"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:35.538765" elapsed="0.000090"/>
</return>
<msg time="2026-04-11T00:54:35.539225" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:35.536928" elapsed="0.002357"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:35.540228" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:35.539680" elapsed="0.001370">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:35.541612" elapsed="0.000060"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:35.542377" elapsed="0.000055"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:35.542674" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:35.542934" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:35.543292" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:35.543578" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:35.543841" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:35.544195" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:35.543966" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:35.543940" elapsed="0.000365"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:35.544626" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:35.544398" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:35.544358" elapsed="0.000424"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:35.545095" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:35.544865" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:35.544842" elapsed="0.000363"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:35.542155" elapsed="0.003082"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:35.541843" elapsed="0.003431"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:35.535888" elapsed="0.009540">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:36.550149" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:36.548791" elapsed="0.001431"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:36.550350" elapsed="0.000113"/>
</return>
<msg time="2026-04-11T00:54:36.550793" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:36.547902" elapsed="0.002951"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:36.551802" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:36.551228" elapsed="0.001356">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:36.553046" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:36.554006" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:36.554467" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:36.554966" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:36.555196" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:36.555393" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:36.555580" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:36.555838" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:36.555672" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:36.555652" elapsed="0.000265"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:36.556130" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:36.555970" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:36.555955" elapsed="0.000251"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:36.556485" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:36.556269" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:36.556250" elapsed="0.000326"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:36.553648" elapsed="0.002954"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:36.553206" elapsed="0.003425"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:36.546793" elapsed="0.009948">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:37.561099" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:37.560308" elapsed="0.000863"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:37.561293" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:54:37.561686" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:37.559453" elapsed="0.002289"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:37.562667" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:37.562092" elapsed="0.001402">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:37.563954" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:37.564895" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:37.565316" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:37.565756" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:37.566163" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:37.566599" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:37.567013" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:37.567670" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:37.567212" elapsed="0.000589"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:37.567171" elapsed="0.000686"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:37.568170" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:37.567975" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:37.567942" elapsed="0.000305"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:37.568473" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:37.568298" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:37.568283" elapsed="0.000269"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:37.564547" elapsed="0.004028"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:37.564114" elapsed="0.004487"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:37.558131" elapsed="0.010567">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:38.573338" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:38.572290" elapsed="0.001144"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:38.573563" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:54:38.573939" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:38.571170" elapsed="0.002829"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:38.575503" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:38.574375" elapsed="0.001970">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:38.576840" elapsed="0.000048"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:38.577816" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:38.578271" elapsed="0.000053"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:38.578764" elapsed="0.000054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:38.579228" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:38.579693" elapsed="0.000049"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:38.580298" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:38.580903" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:38.580527" elapsed="0.000495"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:38.580485" elapsed="0.000587"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:38.581425" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:38.581157" elapsed="0.000360"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:38.581133" elapsed="0.000423"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:38.581893" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:38.581643" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:38.581618" elapsed="0.000403"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:38.577435" elapsed="0.004627"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:38.576987" elapsed="0.005119"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:38.570060" elapsed="0.012190">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:39.586280" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:39.585521" elapsed="0.000829"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:39.586503" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:54:39.586865" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:39.584639" elapsed="0.002284"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:39.587863" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:39.587281" elapsed="0.001363">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:39.589211" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:39.590181" elapsed="0.000037"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:39.590476" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:39.590736" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:39.590993" elapsed="0.000035"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:39.591260" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:39.591538" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:39.591895" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:39.591665" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:39.591638" elapsed="0.000366"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:39.592296" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:39.592076" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:39.592055" elapsed="0.000375"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:39.592726" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:39.592504" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:39.592483" elapsed="0.000349"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:39.589837" elapsed="0.003026"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:39.589415" elapsed="0.003485"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:39.583581" elapsed="0.009478">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:40.597278" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:40.596455" elapsed="0.000895"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:40.597654" elapsed="0.000132"/>
</return>
<msg time="2026-04-11T00:54:40.598097" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:40.595572" elapsed="0.002562"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:40.598733" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:40.598358" elapsed="0.001209">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:40.599863" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:40.600463" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:40.600735" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:40.600999" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:40.601260" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:40.601541" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:40.601822" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:40.602181" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:40.601950" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:40.601923" elapsed="0.000370"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:40.602613" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:40.602367" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:40.602346" elapsed="0.000379"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:40.603021" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:40.602798" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:40.602776" elapsed="0.000354"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:40.600222" elapsed="0.002940"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:40.599966" elapsed="0.003231"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:40.594478" elapsed="0.008851">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:41.607414" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:41.606650" elapsed="0.000836"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:41.607602" elapsed="0.000075"/>
</return>
<msg time="2026-04-11T00:54:41.607950" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:41.605758" elapsed="0.002248"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:41.608924" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:41.608354" elapsed="0.001381">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:41.610198" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:41.611152" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:41.611595" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:41.612003" elapsed="0.000043"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:41.612428" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:41.612831" elapsed="0.000042"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:41.613232" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:41.613941" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:41.613573" elapsed="0.000491"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:41.613530" elapsed="0.000589"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:41.614666" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:41.614238" elapsed="0.000554"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:41.614203" elapsed="0.000642"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:41.615219" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:41.614963" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:41.614929" elapsed="0.000369"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:41.610797" elapsed="0.004524"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:41.610353" elapsed="0.004995"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:41.604657" elapsed="0.010802">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:42.619486" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:42.618636" elapsed="0.000922"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:42.619680" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:54:42.620035" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:42.617763" elapsed="0.002327"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:42.621009" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:42.620468" elapsed="0.001777">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:42.622742" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:42.623694" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:42.624123" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:42.624700" elapsed="0.000061"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:42.625163" elapsed="0.000063"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:42.625796" elapsed="0.000070"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:42.626314" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:42.626949" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:42.626566" elapsed="0.000509"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:42.626524" elapsed="0.000604"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:42.627797" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:42.627373" elapsed="0.000553"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:42.627319" elapsed="0.000660"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:42.628344" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:42.628096" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:42.628062" elapsed="0.000373"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:42.623315" elapsed="0.005142"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:42.622901" elapsed="0.005581"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:42.616729" elapsed="0.011850">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:43.632555" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:43.631736" elapsed="0.000889"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:43.632745" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:54:43.633100" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:43.630902" elapsed="0.002254"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:43.634240" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:43.633691" elapsed="0.001341">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:43.635529" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:43.636347" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:43.636559" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:43.636747" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:43.636934" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:43.637120" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:43.637308" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:43.637578" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:43.637413" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:43.637380" elapsed="0.000277"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:43.637870" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:43.637710" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:43.637694" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:43.638160" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:43.638001" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:43.637986" elapsed="0.000257"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:43.636176" elapsed="0.002089"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:43.635691" elapsed="0.002600"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:43.629858" elapsed="0.008544">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:44.642420" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:44.641654" elapsed="0.000839"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:44.642610" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:54:44.642961" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:44.640792" elapsed="0.002225"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:44.643936" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:44.643366" elapsed="0.001839">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:44.645698" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:44.646635" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:44.647061" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:44.647533" elapsed="0.000053"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:44.647955" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:44.648373" elapsed="0.000073"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:44.648866" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:44.649397" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:44.649065" elapsed="0.000389"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:44.649025" elapsed="0.000525"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:44.649777" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:44.649610" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:44.649593" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:44.650070" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:44.649909" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:44.649894" elapsed="0.000254"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:44.646260" elapsed="0.003911"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:44.645859" elapsed="0.004339"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:44.639697" elapsed="0.010602">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:45.654516" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:45.653667" elapsed="0.000918"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:45.654714" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:54:45.655075" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:45.652573" elapsed="0.002559"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:45.656101" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:45.655529" elapsed="0.001359">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:45.657369" elapsed="0.000078"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:45.658296" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:45.658744" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:45.659153" elapsed="0.000043"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:45.659587" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:45.659994" elapsed="0.000043"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:45.660426" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:45.660984" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:45.660624" elapsed="0.000480"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:45.660585" elapsed="0.000574"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:45.661715" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:45.661275" elapsed="0.000566"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:45.661242" elapsed="0.000649"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:45.662413" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:45.662006" elapsed="0.000477"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:45.661973" elapsed="0.000533"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:45.657954" elapsed="0.004575"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:45.657560" elapsed="0.004996"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:45.651545" elapsed="0.011106">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:46.666616" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:46.665790" elapsed="0.000894"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:46.666802" elapsed="0.000074"/>
</return>
<msg time="2026-04-11T00:54:46.667139" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:46.664979" elapsed="0.002215"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:46.668096" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:46.667566" elapsed="0.001748">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:46.669922" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:46.670898" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:46.671326" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:46.671774" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:46.672189" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:46.672629" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:46.673044" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:46.673628" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:46.673237" elapsed="0.000515"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:46.673198" elapsed="0.000608"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:46.674337" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:46.673922" elapsed="0.000491"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:46.673888" elapsed="0.000551"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:46.674654" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:46.674491" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:46.674476" elapsed="0.000258"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:46.670551" elapsed="0.004205"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:46.670106" elapsed="0.004679"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:46.663977" elapsed="0.010932">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:47.679276" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:47.678441" elapsed="0.000921"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:47.679537" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:54:47.679896" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:47.677547" elapsed="0.002405"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:47.680918" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:47.680309" elapsed="0.001458">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:47.682229" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:47.683212" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:47.683584" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:47.683839" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:47.684090" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:47.684342" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:47.684620" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:47.684975" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:47.684748" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:47.684721" elapsed="0.000362"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:47.685412" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:47.685154" elapsed="0.000426"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:47.685133" elapsed="0.000484"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:47.685920" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:47.685693" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:47.685671" elapsed="0.000357"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:47.682863" elapsed="0.003197"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:47.682419" elapsed="0.003676"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:47.676355" elapsed="0.009876">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:48.690337" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:48.689557" elapsed="0.000889"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:48.690570" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:54:48.690936" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:48.688623" elapsed="0.002370"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:48.692005" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:48.691435" elapsed="0.001553">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:48.693292" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:48.693897" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:48.694315" elapsed="0.000037"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:48.694654" elapsed="0.000040"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:48.694933" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:48.695206" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:48.695523" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:48.695889" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:48.695658" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:48.695628" elapsed="0.000373"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:48.696312" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:48.696075" elapsed="0.000358"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:48.696052" elapsed="0.000417"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:48.696816" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:48.696547" elapsed="0.000350"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:48.696524" elapsed="0.000411"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:48.693676" elapsed="0.003305"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:48.693417" elapsed="0.003602"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:48.687574" elapsed="0.009584">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:49.701435" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:49.700578" elapsed="0.000930"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:49.701628" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:54:49.701980" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:49.699612" elapsed="0.002425"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:49.702961" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:49.702418" elapsed="0.001345">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:49.704285" elapsed="0.000048"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:49.705368" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:49.705657" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:49.705915" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:49.706170" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:49.706442" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:49.706701" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:49.707054" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:49.706826" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:49.706799" elapsed="0.000364"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:49.707479" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:49.707236" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:49.707215" elapsed="0.000373"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:49.707884" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:49.707660" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:49.707639" elapsed="0.000367"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:49.705139" elapsed="0.002905"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:49.704427" elapsed="0.003656"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:49.698517" elapsed="0.009704">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:50.711075" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:50.710581" elapsed="0.000543"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:50.711205" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T00:54:50.711461" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:50.710039" elapsed="0.001459"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:50.712198" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:50.711773" elapsed="0.001310">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:50.713457" elapsed="0.000056"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:50.714418" elapsed="0.000053"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:50.714961" elapsed="0.000054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:50.715443" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:50.715879" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:50.716348" elapsed="0.000083"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:50.716974" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:50.717544" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:50.717195" elapsed="0.000408"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:50.717153" elapsed="0.000476"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:50.717850" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:50.717686" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:50.717670" elapsed="0.000261"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:50.718163" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:50.717986" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:50.717970" elapsed="0.000345"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:50.714030" elapsed="0.004309"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:50.713630" elapsed="0.004736"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:50.709302" elapsed="0.009183">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:51.722534" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:51.721765" elapsed="0.000841"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:51.722726" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:54:51.723078" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:51.720884" elapsed="0.002250"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:51.724065" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:51.723520" elapsed="0.001323">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:51.725318" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:51.726248" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:51.726704" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:51.727116" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:51.727554" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:51.727968" elapsed="0.000044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:51.728406" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:51.728972" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:51.728608" elapsed="0.000486"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:51.728566" elapsed="0.000581"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:51.729708" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:51.729264" elapsed="0.000568"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:51.729230" elapsed="0.000654"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:51.730357" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:51.729998" elapsed="0.000480"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:51.729964" elapsed="0.000543"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:51.725905" elapsed="0.004629"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:51.725512" elapsed="0.005052"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:51.719799" elapsed="0.010859">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:52.734711" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:52.734048" elapsed="0.000708"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:52.734834" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:54:52.735061" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:52.733087" elapsed="0.002009"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:52.735688" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:52.735317" elapsed="0.003179">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:52.738822" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:52.739422" elapsed="0.000034"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:52.739691" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:52.740031" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:52.740287" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:52.740564" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:52.740824" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:52.741178" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:52.740950" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:52.740924" elapsed="0.000362"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:52.741600" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:52.741358" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:52.741337" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:52.742021" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:52.741780" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:52.741759" elapsed="0.000372"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:52.739183" elapsed="0.002980"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:52.738926" elapsed="0.003272"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:52.731952" elapsed="0.010380">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:53.746371" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:53.745627" elapsed="0.000846"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:53.746612" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:54:53.746969" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:53.744798" elapsed="0.002226"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:53.747942" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:53.747374" elapsed="0.001349">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:53.749188" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:53.750132" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:53.750641" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:53.751066" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:53.751485" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:53.751670" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:53.751855" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:53.752110" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:53.751947" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:53.751928" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:53.752414" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:53.752241" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:53.752225" elapsed="0.000270"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:53.752710" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:53.752548" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:53.752532" elapsed="0.000257"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:53.749782" elapsed="0.003030"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:53.749346" elapsed="0.003493"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:53.743725" elapsed="0.009279">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:54.757428" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:54.756549" elapsed="0.000960"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:54.757640" elapsed="0.000089"/>
</return>
<msg time="2026-04-11T00:54:54.758037" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:54.755594" elapsed="0.002523"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:54.759219" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:54.758549" elapsed="0.001300">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:54.760168" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:54.760773" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:54.761043" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:54.761320" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:54.761657" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:54.761922" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:54.762206" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:54.762926" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:54.762676" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:54.762312" elapsed="0.000732"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:54.763489" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:54.763120" elapsed="0.000438"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:54.763098" elapsed="0.000486"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:54.763812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:54.763642" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:54.763624" elapsed="0.000270"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:54.760552" elapsed="0.003365"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:54.760276" elapsed="0.003668"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:54.754365" elapsed="0.009678">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:55.768022" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:55.767194" elapsed="0.000899"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:55.768210" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:54:55.768595" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:55.766371" elapsed="0.002282"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:55.769571" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:55.769003" elapsed="0.001312">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:55.770808" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:55.771741" elapsed="0.000095"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:55.772218" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:55.772665" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:55.773201" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:55.773647" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:55.774066" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:55.774654" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:55.774261" elapsed="0.000516"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:55.774221" elapsed="0.000608"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:55.775292" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:55.774945" elapsed="0.000493"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:55.774911" elapsed="0.000581"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:55.776002" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:55.775605" elapsed="0.000520"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:55.775572" elapsed="0.000604"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:55.771360" elapsed="0.004865"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:55.770966" elapsed="0.005316"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:55.765338" elapsed="0.011187">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:56.780485" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:56.779695" elapsed="0.000861"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:56.780676" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:54:56.781027" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:56.778865" elapsed="0.002217"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:56.782015" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:56.781463" elapsed="0.001327">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.783252" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.784190" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.784701" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.785128" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.785590" elapsed="0.000054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.785902" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.786161" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.786535" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:56.786284" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:56.786259" elapsed="0.000387"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.786945" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:56.786719" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:56.786697" elapsed="0.000358"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.787353" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:56.787127" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:56.787105" elapsed="0.000379"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:54:56.783842" elapsed="0.003675"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:54:56.783439" elapsed="0.004114"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:56.777834" elapsed="0.009850">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:54:56.787806" level="FAIL">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Linear Topology On Member</arg>
<arg>${SWITCHES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:54:26.437086" elapsed="30.350931">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Linear Topology.</doc>
<status status="FAIL" start="2026-04-11T00:54:26.424938" elapsed="30.363294">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t13" name="Check Stats Are Not Frozen After Disconnect" line="116">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:54:56.793229" elapsed="0.000320"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:54:56.792858" elapsed="0.000768"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:54:56.795027" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:56.794863" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:56.794836" elapsed="0.000288"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:54:56.800638" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:54:56.800532" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T00:54:56.800513" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:54:56.801705" 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-11T00:54:56.801309" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:54:56.802178" 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-11T00:54:56.801895" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:54:56.802249" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:54:56.802418" 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-11T00:54:56.800934" elapsed="0.001511"/>
</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-11T00:54:56.802790" 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-11T00:54:56.803032" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:54:56.802886" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:54:56.802870" elapsed="0.000239"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:54:56.802647" elapsed="0.000485"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:54:56.802497" elapsed="0.000660"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:54:56.800146" elapsed="0.003064"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:54:56.794461" elapsed="0.008803"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:54:56.793843" elapsed="0.009465"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:54:56.789545" elapsed="0.013816"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:56.805348" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:56.805052" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:56.805438" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:54:56.805602" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:56.804708" elapsed="0.000920"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:56.806062" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:56.805784" elapsed="0.000586">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.806627" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.806860" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.807078" elapsed="0.000205"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.807470" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.807645" elapsed="0.000020"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:54:56.807710" elapsed="0.000016"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:56.804320" elapsed="0.003497">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.807983" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.808152" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.808333" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.808568" elapsed="0.000026"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:56.808786" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:56.803997" elapsed="0.004898">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:57.813292" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:57.812472" elapsed="0.000890"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:57.813517" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T00:54:57.813917" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:57.811579" elapsed="0.002398"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:57.815029" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:57.814335" elapsed="0.001515">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:57.816327" elapsed="0.000083"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:54:57.816915" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:57.817414" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:57.817669" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:57.817854" elapsed="0.000022"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:54:57.817924" elapsed="0.000018"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:57.810714" elapsed="0.007322">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:57.818205" elapsed="0.000022"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:57.818378" elapsed="0.000038"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:57.818583" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:57.818761" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:57.818972" elapsed="0.000022"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:57.809780" elapsed="0.009305">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:58.823458" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:58.822650" elapsed="0.000885"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:58.823658" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:54:58.824181" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:58.821719" elapsed="0.002520"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:58.825337" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:58.824636" elapsed="0.001622">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:58.826708" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:54:58.827044" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:58.827297" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:58.827562" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:58.827804" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:54:58.827897" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:58.820773" elapsed="0.007274">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:58.828292" elapsed="0.000032"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:58.828573" elapsed="0.000031"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:58.829190" elapsed="0.000035"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:58.829483" elapsed="0.000033"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:58.829831" elapsed="0.000033"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:58.819837" elapsed="0.010157">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:54:59.834217" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:54:59.833411" elapsed="0.000878"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:54:59.834437" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T00:54:59.834734" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:54:59.832569" elapsed="0.002199"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:54:59.835406" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:54:59.834988" elapsed="0.000932">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:59.836221" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:54:59.836572" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:59.836824" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:59.837065" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:59.837302" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:54:59.837414" elapsed="0.000027"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:59.831712" elapsed="0.005856">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:59.837797" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:59.838035" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:59.838306" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:59.838576" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:54:59.838952" elapsed="0.000031"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:54:59.830761" elapsed="0.008348">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:00.843472" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:00.842592" elapsed="0.000955"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:00.843671" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:55:00.844041" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:00.841733" elapsed="0.002364"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:00.845113" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:00.844480" elapsed="0.001455">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:00.846522" elapsed="0.000057"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:00.847096" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:00.847529" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:00.847919" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:00.848300" elapsed="0.000046"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:00.848475" elapsed="0.000038"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:00.840822" elapsed="0.007890">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:00.849076" elapsed="0.000046"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:00.849478" elapsed="0.000046"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:00.849883" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:00.850271" elapsed="0.000045"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:00.850810" elapsed="0.000051"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:00.839888" elapsed="0.011177">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:01.856498" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:01.855542" elapsed="0.001030"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:01.856691" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:55:01.857052" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:01.854612" elapsed="0.002497"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:01.858139" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:01.857505" elapsed="0.001487">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:01.859547" elapsed="0.000054"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:01.859948" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:01.860197" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:01.860458" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:01.860699" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:01.860874" elapsed="0.000025"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:01.853728" elapsed="0.007301">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:01.861263" elapsed="0.000031"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:01.861528" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:01.861788" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:01.862030" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:01.862302" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:01.852753" elapsed="0.009721">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:02.865604" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:02.865052" elapsed="0.000610"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:02.865749" elapsed="0.000067"/>
</return>
<msg time="2026-04-11T00:55:02.866037" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:02.864492" elapsed="0.001586"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:02.866781" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:02.866308" elapsed="0.001289">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:02.868130" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:02.868722" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:02.868972" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:02.869227" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:02.869479" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:02.869572" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:02.863836" elapsed="0.005885">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:02.869947" elapsed="0.000028"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:02.870176" elapsed="0.000027"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:02.870495" elapsed="0.000034"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:02.870742" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:02.871010" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:02.863121" elapsed="0.008041">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:03.875961" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:03.875182" elapsed="0.000849"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:03.876152" elapsed="0.000098"/>
</return>
<msg time="2026-04-11T00:55:03.876562" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:03.874336" elapsed="0.002282"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:03.877631" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:03.876971" elapsed="0.001458">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:03.878899" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:03.879579" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:03.879977" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:03.880437" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:03.880795" elapsed="0.000025"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:03.880869" elapsed="0.000016"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:03.873507" elapsed="0.007471">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:03.881142" elapsed="0.000022"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:03.881310" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:03.881504" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:03.881678" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:03.881876" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:03.871866" elapsed="0.010117">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:04.885966" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:04.885203" elapsed="0.000834"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:04.886152" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:55:04.886530" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:04.884352" elapsed="0.002233"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:04.887571" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:04.886931" elapsed="0.001375">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:04.888835" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:04.889358" elapsed="0.000079"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:04.889756" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:04.890011" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:04.890259" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:04.890353" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:04.883556" elapsed="0.006973">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:04.890769" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:04.891012" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:04.891272" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:04.891543" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:04.891831" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:04.882678" elapsed="0.009309">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:05.896686" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:05.895922" elapsed="0.000834"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:05.896987" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:55:05.897373" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:05.895083" elapsed="0.002376"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:05.898474" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:05.897815" elapsed="0.001407">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:05.899712" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:05.900224" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:05.900645" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:05.901032" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:05.901494" elapsed="0.000049"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:05.901648" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:05.893684" elapsed="0.008208">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:05.902135" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:05.902366" elapsed="0.000047"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:05.902639" elapsed="0.000029"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:05.902880" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:05.903156" elapsed="0.000027"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:05.892711" elapsed="0.010593">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:06.907723" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:06.907149" elapsed="0.000624"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:06.907872" elapsed="0.000057"/>
</return>
<msg time="2026-04-11T00:55:06.908115" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:06.906567" elapsed="0.001586"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:06.908865" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:06.908409" elapsed="0.001029">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:06.909776" elapsed="0.000035"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:06.910159" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:06.910446" elapsed="0.000032"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:06.910699" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:06.910943" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:06.911056" elapsed="0.000026"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:06.905985" elapsed="0.005234">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:06.911485" elapsed="0.000031"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:06.911731" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:06.911993" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:06.912243" elapsed="0.000130"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:06.912665" elapsed="0.000031"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:06.904629" elapsed="0.008198">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:07.917609" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:07.916832" elapsed="0.000849"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:07.917800" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:55:07.918159" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:07.915482" elapsed="0.002734"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:07.919275" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:07.918646" elapsed="0.001408">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:07.920541" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:07.921059" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:07.921493" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:07.921877" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:07.922252" elapsed="0.000098"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:07.922487" elapsed="0.000040"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:07.914626" elapsed="0.008099">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:07.922983" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:07.923152" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:07.923332" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:07.923519" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:07.923716" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:07.913632" elapsed="0.010191">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:08.928032" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:08.927256" elapsed="0.000847"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:08.928217" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:55:08.928604" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:08.926338" elapsed="0.002322"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:08.929684" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:08.929010" elapsed="0.001487">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:08.930990" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:08.931542" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:08.931934" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:08.932314" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:08.932724" elapsed="0.000045"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:08.932994" elapsed="0.000038"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:08.925521" elapsed="0.007750">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:08.933726" elapsed="0.000054"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:08.934119" elapsed="0.000048"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:08.934568" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:08.935088" elapsed="0.000061"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:08.935599" elapsed="0.000048"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:08.924574" elapsed="0.011285">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:09.938939" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:09.938114" elapsed="0.000872"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:09.939065" elapsed="0.000053"/>
</return>
<msg time="2026-04-11T00:55:09.939293" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:09.937598" elapsed="0.001766"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:09.940005" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:09.939608" elapsed="0.000926">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:09.940833" elapsed="0.000036"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:09.941159" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:09.941423" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:09.941664" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:09.941897" elapsed="0.000032"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:09.941990" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:09.937058" elapsed="0.005076">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:09.942358" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:09.942609" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:09.942855" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:09.943091" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:09.943401" elapsed="0.000031"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:09.936468" elapsed="0.007087">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:10.947821" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:10.947034" elapsed="0.000886"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:10.948059" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T00:55:10.948458" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:10.946135" elapsed="0.002381"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:10.949555" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:10.948872" elapsed="0.001477">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:10.950854" elapsed="0.000053"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:10.951579" elapsed="0.000093"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:10.952089" elapsed="0.000063"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:10.952546" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:10.952960" elapsed="0.000055"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:10.953085" elapsed="0.000018"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:10.945254" elapsed="0.007954">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:10.953377" elapsed="0.000037"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:10.953565" elapsed="0.000021"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:10.953749" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:10.953923" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:10.954121" elapsed="0.000026"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:10.944302" elapsed="0.009937">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:11.958371" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:11.957614" elapsed="0.000857"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:11.958592" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:55:11.958948" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:11.956753" elapsed="0.002249"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:11.960614" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:11.959347" elapsed="0.002064">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:11.961869" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:11.962380" elapsed="0.000083"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:11.962800" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:11.963172" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:11.963569" elapsed="0.000046"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:11.963714" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:11.955881" elapsed="0.008063">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:11.964301" elapsed="0.000132"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:11.964829" elapsed="0.000058"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:11.965105" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:11.965284" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:11.965493" elapsed="0.000022"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:11.954962" elapsed="0.010641">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:12.969731" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:12.968966" elapsed="0.000833"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:12.970045" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:55:12.970436" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:12.968106" elapsed="0.002389"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:12.971537" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:12.970847" elapsed="0.001461">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:12.972795" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:12.973335" elapsed="0.000081"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:12.973764" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:12.974180" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:12.974583" elapsed="0.000047"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:12.974730" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:12.967271" elapsed="0.007690">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:12.975357" elapsed="0.000074"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:12.975764" elapsed="0.000046"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:12.976165" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:12.976581" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:12.977061" elapsed="0.000047"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:12.966324" elapsed="0.010979">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:13.981553" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:13.980725" elapsed="0.000900"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:13.981745" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:55:13.982104" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:13.979877" elapsed="0.002282"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:13.983173" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:13.982545" elapsed="0.001987">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:13.985006" elapsed="0.000052"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:13.985654" elapsed="0.000060"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:13.986020" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:13.986257" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:13.986517" elapsed="0.000030"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:13.986609" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:13.979024" elapsed="0.007734">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:13.986984" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:13.987213" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:13.987480" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:13.987817" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:13.988097" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:13.978064" elapsed="0.010182">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:14.992475" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:14.991704" elapsed="0.000842"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:14.992663" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:55:14.993019" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:14.990813" elapsed="0.002263"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:14.994112" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:14.993460" elapsed="0.001434">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:14.995357" elapsed="0.000082"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:14.995908" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:14.996298" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:14.996711" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:14.997084" elapsed="0.000044"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:14.997229" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:14.989891" elapsed="0.007599">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:14.997857" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:14.998432" elapsed="0.000048"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:14.998841" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:14.999176" elapsed="0.000024"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:14.999377" elapsed="0.000034"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:14.988942" elapsed="0.010557">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:16.003926" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:16.003149" elapsed="0.000847"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:16.004111" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:55:16.004492" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:16.002100" elapsed="0.002450"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:16.005549" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:16.004897" elapsed="0.001399">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:16.006882" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:16.007511" elapsed="0.003012"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:16.010917" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:16.011201" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:16.011460" elapsed="0.000022"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:16.011529" elapsed="0.000017"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:16.001159" elapsed="0.010480">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:16.011805" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:16.011997" elapsed="0.000023"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:16.012193" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:16.012402" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:16.012612" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:16.000202" elapsed="0.012520">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:17.016919" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:17.016135" elapsed="0.000854"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:17.017107" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:55:17.017500" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:17.015287" elapsed="0.002271"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:17.018573" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:17.017912" elapsed="0.001458">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:17.019868" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:17.020411" elapsed="0.000057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:17.020813" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:17.021197" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:17.021605" elapsed="0.000047"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:17.021752" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:17.014361" elapsed="0.007624">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:17.022351" elapsed="0.000075"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:17.022755" elapsed="0.000044"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:17.023206" elapsed="0.000050"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:17.023623" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:17.024060" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:17.013464" elapsed="0.010711">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:18.026620" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:18.026222" elapsed="0.000435"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:18.026718" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:55:18.026905" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:18.025794" elapsed="0.001141"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:18.027467" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:18.027128" elapsed="0.000808">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:18.028248" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:18.028505" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:18.028686" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:18.028859" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:18.029031" elapsed="0.000020"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:18.029096" elapsed="0.000016"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:18.025275" elapsed="0.003930">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:18.029370" elapsed="0.000034"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:18.029552" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:18.029728" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:18.029899" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:18.030093" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:18.024714" elapsed="0.005484">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:19.034469" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:19.033808" elapsed="0.000723"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:19.034631" elapsed="0.000067"/>
</return>
<msg time="2026-04-11T00:55:19.034927" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:19.033050" elapsed="0.001924"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:19.035804" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:19.035265" elapsed="0.001246">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:19.036834" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:19.037165" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:19.037432" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:19.037672" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:19.037906" elapsed="0.000027"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:19.037995" elapsed="0.000021"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:19.032301" elapsed="0.005841">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:19.038369" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:19.038622" elapsed="0.000027"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:19.038869" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:19.039110" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:19.039400" elapsed="0.000030"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:19.031496" elapsed="0.008058">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:20.043882" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:20.043101" elapsed="0.000851"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:20.044069" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:55:20.044458" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:20.042116" elapsed="0.002420"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:20.045553" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:20.044894" elapsed="0.001560">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:20.046929" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:20.047480" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:20.047877" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:20.048258" elapsed="0.000043"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:20.048718" elapsed="0.000048"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:20.048865" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:20.041270" elapsed="0.007831">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:20.049272" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:20.049453" elapsed="0.000021"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:20.049638" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:20.049810" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:20.050006" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:20.040248" elapsed="0.009864">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:21.054999" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:21.054142" elapsed="0.000925"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:21.055183" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T00:55:21.055571" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:21.053292" elapsed="0.002337"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:21.056637" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:21.055987" elapsed="0.001464">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:21.057910" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:21.058457" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:21.058856" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:21.059238" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:21.059646" elapsed="0.000045"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:21.059790" elapsed="0.000034"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:21.051800" elapsed="0.008222">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:21.060381" elapsed="0.000076"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:21.060782" elapsed="0.000043"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:21.061345" elapsed="0.000078"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:21.061770" elapsed="0.000045"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:21.062202" elapsed="0.000044"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:21.050854" elapsed="0.011616">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:22.066754" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:22.065967" elapsed="0.000857"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:22.066944" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:55:22.067307" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:22.065093" elapsed="0.002271"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:22.068373" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:22.067749" elapsed="0.001404">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:22.069689" elapsed="0.000053"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:22.070187" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:22.070366" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:22.070556" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:22.070727" elapsed="0.000020"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:22.070792" elapsed="0.000016"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:22.064244" elapsed="0.006655">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:22.071063" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:22.071232" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:22.071433" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:22.071611" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:22.071811" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:22.063237" elapsed="0.008683">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:23.075330" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:23.074763" elapsed="0.000699"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:23.075608" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:55:23.076014" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:23.073712" elapsed="0.002367"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:23.077168" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:23.076481" elapsed="0.001502">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:23.078521" elapsed="0.000067"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:23.079118" elapsed="0.000059"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:23.079558" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:23.079969" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:23.080593" elapsed="0.000066"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:23.080770" elapsed="0.000040"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:23.073124" elapsed="0.007892">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:23.081425" elapsed="0.000051"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:23.081881" elapsed="0.000054"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:23.082366" elapsed="0.000087"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:23.082804" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:23.083262" elapsed="0.000025"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:23.072485" elapsed="0.010912">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:24.087431" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:24.086745" elapsed="0.000734"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:24.087557" elapsed="0.000056"/>
</return>
<msg time="2026-04-11T00:55:24.087788" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:24.085847" elapsed="0.001977"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:24.088467" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:24.088046" elapsed="0.000924">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:24.089267" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:24.089613" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:24.089865" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:24.090103" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:24.090341" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:24.090452" elapsed="0.000025"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:24.085000" elapsed="0.005621">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:24.090850" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:24.091084" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:24.091333" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:24.091596" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:24.091871" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:24.084068" elapsed="0.007954">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:25.097437" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:25.095927" elapsed="0.001591"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:25.097648" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:55:25.098041" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:25.094966" elapsed="0.003137"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:25.099546" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:25.098528" elapsed="0.001836">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:25.100608" elapsed="0.000025"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:25.100851" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:25.101034" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:25.101212" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:25.101401" elapsed="0.000022"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:25.101470" elapsed="0.000016"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:25.093938" elapsed="0.007642">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:25.101763" elapsed="0.000028"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:25.101949" elapsed="0.000022"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:25.102151" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:25.102334" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:25.102554" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:25.092802" elapsed="0.009864">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:26.106989" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:26.106114" elapsed="0.000946"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:26.107181" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T00:55:26.107589" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:26.105262" elapsed="0.002412"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:26.108766" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:26.108035" elapsed="0.001536">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:26.110037" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:26.110591" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:26.110990" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:26.111373" elapsed="0.000076"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:26.111836" elapsed="0.000047"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:26.111986" elapsed="0.000038"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:26.104434" elapsed="0.007792">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:26.112440" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:26.112609" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:26.112786" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:26.112956" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:26.113154" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:26.103365" elapsed="0.009896">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:27.115498" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:27.115109" elapsed="0.000424"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:27.115594" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:55:27.115766" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:27.114716" elapsed="0.001076"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:27.116577" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:27.115953" elapsed="0.001006">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.117179" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.117436" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.117618" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.117793" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.117965" elapsed="0.000021"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:55:27.118031" elapsed="0.000017"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:27.114298" elapsed="0.003842">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.118305" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.118494" elapsed="0.000022"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.118678" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.118854" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.119051" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:55:27.113810" elapsed="0.005348">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:55:27.119244" level="FAIL">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>Check Flow Stats Are Not Frozen</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:54:56.803545" elapsed="30.315791">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check that duration flow stat is increasing</doc>
<status status="FAIL" start="2026-04-11T00:54:56.788780" elapsed="30.330740">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t14" name="Remove Flows And Groups After Mininet Is Disconnected" line="120">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:55:27.122966" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:55:27.122701" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:55:27.124340" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:55:27.124212" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-11T00:55:27.124189" elapsed="0.000237"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:55:27.129179" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:55:27.129073" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T00:55:27.129055" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:55:27.130262" 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-11T00:55:27.129882" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:55:27.130760" 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-11T00:55:27.130472" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:55:27.130830" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:55:27.130982" 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-11T00:55:27.129491" elapsed="0.001571"/>
</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-11T00:55:27.131453" 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-11T00:55:27.131700" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:55:27.131552" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:55:27.131535" elapsed="0.000241"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:55:27.131286" elapsed="0.000513"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:55:27.131123" elapsed="0.000702"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:55:27.128717" elapsed="0.003162"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:55:27.123891" elapsed="0.008042"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:55:27.123423" elapsed="0.008554"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:55:27.120543" elapsed="0.011485"/>
</kw>
<kw name="Remove Single Group And Flow On Member">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:27.133195" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:27.132901" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:27.133267" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:55:27.133429" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:27.132557" elapsed="0.000898"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:27.136326" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A${switch}/flow-node-inventory:table=0/flow=1</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:27.136052" elapsed="0.000589">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="DELETE On Session" owner="RequestsLibrary">
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A${switch}/flow-node-inventory:group=1</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.136812" elapsed="0.000022"/>
</kw>
<kw name="DELETE On Session" owner="RequestsLibrary">
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A${switch}/flow-node-inventory:group=1000</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.136978" elapsed="0.000019"/>
</kw>
<var name="${switch}">1</var>
<status status="FAIL" start="2026-04-11T00:55:27.135913" elapsed="0.001138">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="FAIL" start="2026-04-11T00:55:27.133506" elapsed="0.003601">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</for>
<doc>Remove 1 group 1&amp;2 and 1 flow in every switch.</doc>
<status status="FAIL" start="2026-04-11T00:55:27.132217" elapsed="0.004981">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Remove 1 group 1&amp;2 and 1 flow in every switch.</doc>
<status status="FAIL" start="2026-04-11T00:55:27.119932" elapsed="0.017388">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t15" name="Check Flows In Operational DS After Mininet Is Disconnected" line="124">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:55:27.140562" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:55:27.140274" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:55:27.141794" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:55:27.141684" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T00:55:27.141665" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:55:27.146564" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:55:27.146457" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T00:55:27.146439" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:55:27.147607" 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-11T00:55:27.147219" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:55:27.148072" 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-11T00:55:27.147791" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:55:27.148141" elapsed="0.000050"/>
</return>
<msg time="2026-04-11T00:55:27.148357" 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-11T00:55:27.146850" elapsed="0.001546"/>
</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-11T00:55:27.148746" 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-11T00:55:27.148988" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:55:27.148843" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:55:27.148826" elapsed="0.000238"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:55:27.148601" elapsed="0.000487"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:55:27.148450" elapsed="0.000662"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:55:27.146090" elapsed="0.003075"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:55:27.141400" elapsed="0.007819"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:55:27.140971" elapsed="0.008292"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:55:27.138146" elapsed="0.011167"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:27.151043" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:27.150753" elapsed="0.000316"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:27.151115" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:55:27.151259" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:27.150408" elapsed="0.000874"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:27.151864" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:27.151450" elapsed="0.000728">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.152405" elapsed="0.000024"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.152601" elapsed="0.000021"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:27.152800" elapsed="0.000020"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:27.150023" elapsed="0.002888">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:28.156451" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:28.155700" elapsed="0.000819"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:28.156634" elapsed="0.000136"/>
</return>
<msg time="2026-04-11T00:55:28.157048" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:28.154881" elapsed="0.002229"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:28.158077" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:28.157531" elapsed="0.001326">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:28.159317" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:28.159773" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:28.160211" elapsed="0.000047"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:28.153829" elapsed="0.006679">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:29.164063" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:29.163285" elapsed="0.000847"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:29.164379" elapsed="0.000115"/>
</return>
<msg time="2026-04-11T00:55:29.164774" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:29.162503" elapsed="0.002326"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:29.165772" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:29.165178" elapsed="0.001377">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:29.167001" elapsed="0.000047"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:29.167442" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:29.167875" elapsed="0.000044"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:29.161493" elapsed="0.006630">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:30.172074" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:30.171248" elapsed="0.000901"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:30.172277" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:55:30.172696" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:30.170347" elapsed="0.002409"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:30.173840" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:30.173140" elapsed="0.001485">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:30.174948" elapsed="0.000037"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:30.175233" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:30.175567" elapsed="0.000366"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:30.169161" elapsed="0.006920">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:31.179972" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:31.179182" elapsed="0.000860"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:31.180162" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:55:31.180552" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:31.178341" elapsed="0.002269"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:31.181525" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:31.180958" elapsed="0.001330">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:31.182778" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:31.183203" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:31.183671" elapsed="0.000047"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:31.177162" elapsed="0.006763">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:32.188038" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:32.187215" elapsed="0.000898"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:32.188237" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:55:32.188651" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:32.186319" elapsed="0.002392"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:32.189698" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:32.189082" elapsed="0.001460">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:32.191161" elapsed="0.000054"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:32.191674" elapsed="0.000052"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:32.192151" elapsed="0.000049"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:32.185141" elapsed="0.007315">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:33.196282" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:33.195487" elapsed="0.000865"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:33.196483" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:55:33.196714" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:33.194647" elapsed="0.002102"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:33.197314" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:33.196970" elapsed="0.000868">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:33.198133" elapsed="0.000030"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:33.198411" elapsed="0.000051"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:33.198709" elapsed="0.000029"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:33.193555" elapsed="0.005313">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:34.203110" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:34.202342" elapsed="0.000837"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:34.203293" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T00:55:34.203680" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:34.201535" elapsed="0.002202"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:34.204699" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:34.204087" elapsed="0.001385">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:34.205926" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:34.206347" elapsed="0.000053"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:34.206820" elapsed="0.000046"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:34.199842" elapsed="0.007231">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:35.210870" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:35.210096" elapsed="0.000843"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:35.211056" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:55:35.211443" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:35.209173" elapsed="0.002329"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:35.212393" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:35.211848" elapsed="0.001340">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:35.213695" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:35.214117" elapsed="0.000044"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:35.214577" elapsed="0.000045"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:35.208051" elapsed="0.006779">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:36.218923" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:36.218068" elapsed="0.000927"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:36.219119" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:55:36.219534" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:36.217141" elapsed="0.002476"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:36.220680" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:36.220020" elapsed="0.001459">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:36.221953" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:36.222399" elapsed="0.000077"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:36.222914" elapsed="0.000049"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:36.216074" elapsed="0.007108">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:37.227682" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:37.226643" elapsed="0.001149"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:37.227930" elapsed="0.000094"/>
</return>
<msg time="2026-04-11T00:55:37.228334" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:37.225697" elapsed="0.002734"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:37.229919" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:37.228802" elapsed="0.001661">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:37.230785" elapsed="0.000040"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:37.231070" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:37.231342" elapsed="0.000029"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:37.224391" elapsed="0.007141">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:38.235363" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:38.234618" elapsed="0.000847"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:38.235586" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:55:38.235941" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:38.233760" elapsed="0.002237"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:38.236977" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:38.236348" elapsed="0.001423">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:38.238232" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:38.238697" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:38.239139" elapsed="0.000046"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:38.232451" elapsed="0.006973">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:39.243497" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:39.242664" elapsed="0.000923"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:39.243743" elapsed="0.000105"/>
</return>
<msg time="2026-04-11T00:55:39.244236" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:39.241717" elapsed="0.002800"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:39.245762" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:39.244970" elapsed="0.001742">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:39.247295" elapsed="0.000073"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:39.247947" elapsed="0.000058"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:39.248453" elapsed="0.000049"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:39.240564" elapsed="0.008155">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:40.252504" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:40.251730" elapsed="0.000843"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:40.252694" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:55:40.253046" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:40.250898" elapsed="0.002204"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:40.254052" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:40.253508" elapsed="0.001323">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:40.255289" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:40.255755" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:40.256190" elapsed="0.000045"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:40.249849" elapsed="0.006622">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:41.261063" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:41.260247" elapsed="0.000885"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:41.261253" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:55:41.261666" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:41.259227" elapsed="0.002498"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:41.262705" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:41.262082" elapsed="0.001415">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:41.263995" elapsed="0.000054"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:41.264475" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:41.264925" elapsed="0.000046"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:41.258098" elapsed="0.007082">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:42.268901" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:42.268125" elapsed="0.000843"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:42.269086" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:55:42.269468" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:42.267295" elapsed="0.002230"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:42.270465" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:42.269874" elapsed="0.001338">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:42.271704" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:42.272260" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:42.272739" elapsed="0.000047"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:42.266213" elapsed="0.006780">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:43.276882" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:43.276041" elapsed="0.000909"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:43.277070" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:55:43.277460" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:43.275202" elapsed="0.002316"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:43.278455" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:43.277870" elapsed="0.001361">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:43.279726" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:43.280153" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:43.280623" elapsed="0.000059"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:43.274058" elapsed="0.006867">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:44.287227" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:44.286482" elapsed="0.000813"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:44.287447" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:55:44.287804" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:44.282918" elapsed="0.004941"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:44.288783" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:44.288208" elapsed="0.001357">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:44.290069" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:44.290548" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:44.290883" elapsed="0.000021"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:44.281880" elapsed="0.009119">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:45.294575" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:45.293775" elapsed="0.000869"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:45.294757" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:55:45.295108" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:45.292946" elapsed="0.002217"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:45.296093" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:45.295554" elapsed="0.001313">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:45.297325" elapsed="0.000048"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:45.297789" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:45.298245" elapsed="0.000045"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:45.291901" elapsed="0.006624">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:46.302433" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:46.301662" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:46.302621" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:55:46.302977" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:46.300745" elapsed="0.002288"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:46.304012" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:46.303415" elapsed="0.001409">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:46.305367" elapsed="0.000088"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:46.305846" elapsed="0.000054"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:46.306326" elapsed="0.000049"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:46.299509" elapsed="0.007120">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:47.309277" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:47.308758" elapsed="0.000566"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:47.309431" elapsed="0.000056"/>
</return>
<msg time="2026-04-11T00:55:47.309675" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:47.308194" elapsed="0.001519"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:47.310713" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:47.309948" elapsed="0.001286">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:47.311597" elapsed="0.000034"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:47.311884" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:47.312175" elapsed="0.000030"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:47.307430" elapsed="0.004912">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:48.316565" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:48.315624" elapsed="0.001028"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:48.316779" elapsed="0.000089"/>
</return>
<msg time="2026-04-11T00:55:48.317270" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:48.314656" elapsed="0.002698"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:48.318146" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:48.317785" elapsed="0.000908">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:48.318990" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:48.319261" elapsed="0.000038"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:48.319574" elapsed="0.000030"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:48.313425" elapsed="0.006311">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:49.323536" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:49.322677" elapsed="0.000929"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:49.323720" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:55:49.324068" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:49.321775" elapsed="0.002350"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:49.325195" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:49.324639" elapsed="0.001386">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:49.326546" elapsed="0.000069"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:49.327042" elapsed="0.000053"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:49.327539" elapsed="0.000048"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:49.320729" elapsed="0.007073">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:50.331597" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:50.330814" elapsed="0.000852"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:50.331782" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:55:50.332142" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:50.329929" elapsed="0.002269"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:50.333123" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:50.332583" elapsed="0.001323">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:50.334379" elapsed="0.000084"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:50.334845" elapsed="0.000052"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:50.335309" elapsed="0.000044"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:50.328850" elapsed="0.006742">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:51.340074" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:51.339218" elapsed="0.000927"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:51.340261" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:55:51.340657" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:51.338363" elapsed="0.002351"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:51.341655" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:51.341071" elapsed="0.001550">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:51.343119" elapsed="0.000044"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:51.343506" elapsed="0.000039"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:51.343871" elapsed="0.000037"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:51.336640" elapsed="0.007413">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:52.346898" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:52.346262" elapsed="0.000692"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:52.347081" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T00:55:52.347518" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:52.345654" elapsed="0.001923"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:52.348519" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:52.347936" elapsed="0.001353">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:52.349866" elapsed="0.000071"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:52.350338" elapsed="0.000079"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:52.350960" elapsed="0.000049"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:52.344771" elapsed="0.006462">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:53.354839" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:53.354057" elapsed="0.000849"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:53.355033" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:55:53.355414" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:53.353233" elapsed="0.002241"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:53.356366" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:53.355824" elapsed="0.001364">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:53.357676" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:53.358099" elapsed="0.000044"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:53.358560" elapsed="0.000046"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:53.352148" elapsed="0.006662">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:54.362707" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:54.361898" elapsed="0.000884"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:54.362908" elapsed="0.000101"/>
</return>
<msg time="2026-04-11T00:55:54.363304" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:54.361051" elapsed="0.002309"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:54.365119" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:54.363767" elapsed="0.002269">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:54.366575" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:54.367007" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:54.367467" elapsed="0.000064"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:54.359887" elapsed="0.007965">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:55.371605" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:55.370832" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:55.371792" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:55:55.372177" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:55.369964" elapsed="0.002270"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:55.373169" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:55.372620" elapsed="0.001330">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:55.374467" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:55.374897" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:55.375332" elapsed="0.000045"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:55.368887" elapsed="0.006726">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:56.379571" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:56.378748" elapsed="0.000895"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:56.379904" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:55:56.380320" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:56.377852" elapsed="0.002558"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:56.381449" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:56.380796" elapsed="0.001447">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:56.382771" elapsed="0.000054"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:56.383231" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:56.383737" elapsed="0.000051"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:56.376703" elapsed="0.007305">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:57.387727" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:57.386952" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:57.387911" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:55:57.388270" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:57.386096" elapsed="0.002231"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:57.389249" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:57.388708" elapsed="0.001348">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:57.390596" elapsed="0.000057"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:57.391045" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:57.391362" elapsed="0.000048"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:57.385016" elapsed="0.006531">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:55:57.391667" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Flows On Member</arg>
<arg>${less_flows}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:55:27.149487" elapsed="30.242306">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Flows in Operational DS.</doc>
<status status="FAIL" start="2026-04-11T00:55:27.137623" elapsed="30.254383">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t16" name="Check Groups In Operational DS After Mininet Is Disconnected" line="132">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:55:57.397101" elapsed="0.000319"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:55:57.396724" elapsed="0.000776"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:55:57.398970" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:55:57.398803" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-11T00:55:57.398773" elapsed="0.000314"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:55:57.403917" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:55:57.403810" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T00:55:57.403791" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:55:57.404990" 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-11T00:55:57.404614" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:55:57.405474" 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-11T00:55:57.405175" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:55:57.405544" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:55:57.405695" 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-11T00:55:57.404220" elapsed="0.001498"/>
</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-11T00:55:57.406154" 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-11T00:55:57.406461" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:55:57.406253" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:55:57.406235" elapsed="0.000308"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:55:57.406007" elapsed="0.000559"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:55:57.405847" elapsed="0.000745"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:55:57.403453" elapsed="0.003193"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:55:57.398375" elapsed="0.008325"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:55:57.397722" elapsed="0.009022"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:55:57.393288" elapsed="0.013506"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:57.408541" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:57.408234" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:57.408612" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:55:57.408758" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:57.407886" elapsed="0.000897"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:57.409167" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:57.408937" elapsed="0.000550">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:57.409681" elapsed="0.000022"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:57.409868" elapsed="0.000020"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:57.410062" elapsed="0.000020"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:57.407511" elapsed="0.002662">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:58.413848" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:58.413126" elapsed="0.000785"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:58.414017" elapsed="0.000069"/>
</return>
<msg time="2026-04-11T00:55:58.414359" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:58.411824" elapsed="0.002623"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:58.415362" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:58.414801" elapsed="0.001274">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:58.416574" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:58.416994" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:58.417446" elapsed="0.000048"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:58.410908" elapsed="0.006788">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:55:59.421294" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:55:59.420553" elapsed="0.000814"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:55:59.421516" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:55:59.421933" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:55:59.419723" elapsed="0.002269"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:55:59.422720" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:55:59.422348" elapsed="0.000871">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:59.423531" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:59.423801" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:55:59.424077" elapsed="0.000028"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:55:59.418681" elapsed="0.005555">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:00.427822" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:00.427010" elapsed="0.000881"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:00.428006" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:56:00.428357" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:00.426170" elapsed="0.002275"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:00.429335" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:00.428796" elapsed="0.001309">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:00.430588" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:00.431017" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:00.431529" elapsed="0.000048"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:56:00.425106" elapsed="0.006679">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:01.435441" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:01.434676" elapsed="0.000835"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:01.435624" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T00:56:01.435971" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:01.433857" elapsed="0.002169"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:01.437485" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:01.436368" elapsed="0.001612">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:01.438271" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:01.438559" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:01.438833" elapsed="0.000030"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:56:01.432807" elapsed="0.006186">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:02.442579" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:02.441787" elapsed="0.000859"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:02.442758" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T00:56:02.443110" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:02.440966" elapsed="0.002201"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:02.444087" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:02.443550" elapsed="0.001297">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:02.445296" elapsed="0.000048"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:02.445871" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:02.446355" elapsed="0.000075"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:56:02.439908" elapsed="0.006732">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:03.450591" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:03.449811" elapsed="0.000850"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:03.450778" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:56:03.451133" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:03.448955" elapsed="0.002280"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:03.452177" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:03.451626" elapsed="0.001123">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:03.453039" elapsed="0.000030"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:03.453310" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:03.453604" elapsed="0.000028"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:56:03.447845" elapsed="0.005918">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:04.457328" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:04.456595" elapsed="0.000807"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:04.457554" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:56:04.457935" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:04.455774" elapsed="0.002217"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:04.458988" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:04.458337" elapsed="0.001437">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:04.460224" elapsed="0.000048"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:04.460678" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:04.461113" elapsed="0.000045"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:56:04.454710" elapsed="0.006651">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:05.465791" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:05.465003" elapsed="0.000857"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:05.465975" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T00:56:05.466354" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:05.464124" elapsed="0.002335"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:05.467355" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:05.466816" elapsed="0.001316">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:05.468620" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:05.469094" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:05.469568" elapsed="0.000046"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:56:05.463072" elapsed="0.006750">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:06.473940" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:06.473431" elapsed="0.000555"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:06.474066" elapsed="0.000057"/>
</return>
<msg time="2026-04-11T00:56:06.474323" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:06.472283" elapsed="0.002083"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:06.474983" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:06.474635" elapsed="0.000885">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:06.475811" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:06.476075" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:06.476346" elapsed="0.000028"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:56:06.470993" elapsed="0.005537">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.480465" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:07.479676" elapsed="0.000865"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:07.480658" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:56:07.481011" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:07.478828" elapsed="0.002240"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:07.482051" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.481480" elapsed="0.001374">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.483341" elapsed="0.000057"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.483807" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.484243" elapsed="0.000045"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.477740" elapsed="0.006811">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:56:07.484749" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Groups On Member</arg>
<arg>${less_groups}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:55:57.406958" elapsed="10.077988">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Groups in Operational DS.</doc>
<status status="FAIL" start="2026-04-11T00:55:57.392520" elapsed="10.092756">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t17" name="Check Flows In Switch After Mininet Is Disconnected" line="140">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:56:07.489653" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:56:07.489333" elapsed="0.000615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.491087" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:07.490926" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:07.490897" elapsed="0.000282"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.496248" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:07.496136" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:07.496116" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.497391" 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-11T00:56:07.496986" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.497890" 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-11T00:56:07.497600" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:07.497960" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:56:07.498217" 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-11T00:56:07.496587" elapsed="0.001659"/>
</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-11T00:56:07.498647" 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-11T00:56:07.498896" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:07.498748" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:56:07.498730" elapsed="0.000243"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:56:07.498497" elapsed="0.000498"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.498312" elapsed="0.000710"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:56:07.495759" elapsed="0.003317"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:56:07.490613" elapsed="0.008520"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:07.490127" elapsed="0.009052"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:56:07.486856" elapsed="0.012374"/>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<msg time="2026-04-11T00:56:07.503518" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<arg>${less_flows}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-11T00:56:07.499521" elapsed="0.004037">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Check Flows in switch.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.486067" elapsed="0.017633">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s4-t18" name="Reconnect Mininet To Owner" line="144">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:56:07.507154" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:56:07.506887" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.508428" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:07.508300" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:07.508281" elapsed="0.000218"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.513259" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:07.513150" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:07.513130" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.514337" 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-11T00:56:07.513959" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.514872" 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-11T00:56:07.514575" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:07.514944" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:56:07.515097" 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-11T00:56:07.513582" elapsed="0.001540"/>
</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-11T00:56:07.515487" 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-11T00:56:07.515734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:07.515586" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:56:07.515570" elapsed="0.000241"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:56:07.515324" elapsed="0.000510"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.515174" elapsed="0.000685"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:56:07.512790" elapsed="0.003122"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:56:07.508014" elapsed="0.007953"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:07.507593" elapsed="0.008458"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:56:07.504559" elapsed="0.011547"/>
</kw>
<kw name="Disconnect Cluster Mininet" owner="MininetKeywords">
<msg time="2026-04-11T00:56:07.520540" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>restore</arg>
<arg>${original_owner_list}</arg>
<doc>Break and restore controller to mininet connection via iptables.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.516373" elapsed="0.004208">Variable '${original_owner_list}' not found.</status>
</kw>
<doc>Reconnect mininet to switch 1 owner.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.504026" elapsed="0.016690">Variable '${original_owner_list}' not found.</status>
</test>
<test id="s1-s4-t19" name="Check Entity Owner Status And Find Owner and Successor After Reconnect" line="148">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:56:07.524109" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:56:07.523842" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.525369" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:07.525259" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:07.525239" elapsed="0.000220"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.530215" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:07.530107" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:07.530088" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.531330" 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-11T00:56:07.530940" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.531826" 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-11T00:56:07.531540" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:07.531897" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:56:07.532050" 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-11T00:56:07.530523" elapsed="0.001552"/>
</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-11T00:56:07.532435" 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-11T00:56:07.532680" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:07.532534" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:56:07.532517" elapsed="0.000239"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:56:07.532273" elapsed="0.000506"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.532126" elapsed="0.000678"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:56:07.529748" elapsed="0.003109"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:56:07.524973" elapsed="0.007939"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:07.524550" elapsed="0.008406"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:56:07.521512" elapsed="0.011494"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.569185" 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-11T00:56:07.568804" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.569715" 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-11T00:56:07.569376" elapsed="0.000365"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:07.569786" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:56:07.569942" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:07.568430" elapsed="0.001536"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:07.574796" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:07.574612" elapsed="0.000210"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:07.574974" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:07.575547" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:07.575322" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.576039" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:07.575783" elapsed="0.000297"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:07.576229" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:07.576787" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:07.576582" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.577225" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:07.576982" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.577779" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:07.577438" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.578205" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:07.577972" elapsed="0.000275"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.578701" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:07.578415" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:07.586613" elapsed="0.000293"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:07.596092" elapsed="0.000439"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.597373" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:07.596800" elapsed="0.000699"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:07.599844" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.599312" elapsed="0.000678">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.600080" elapsed="0.000076"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.597830" elapsed="0.002476">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.600665" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.601061" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.601550" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.601944" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.602298" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.602664" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.602981" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.603370" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.603719" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.605114" elapsed="0.000053"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.606170" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.607178" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:07.604030" elapsed="0.003253"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.603892" elapsed="0.003453"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.607577" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.607743" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.595294" elapsed="0.012563">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.607926" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.584298" elapsed="0.023728">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.608205" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.612895" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.613096" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.613163" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.574059" elapsed="0.039211">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:07.613393" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:07.613451" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:07.573504" elapsed="0.039970"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.613686" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:07.613565" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:07.613542" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:07.615061" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.615761" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:07.615450" elapsed="0.000337"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:07.616765" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.616317" elapsed="0.000536">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.616915" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.615972" elapsed="0.001045">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.617191" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.617366" elapsed="0.000085"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.617620" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.617796" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.617966" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.618134" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.618301" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.618641" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.618815" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.619081" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.619259" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.619449" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:07.618948" elapsed="0.000556"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.618881" elapsed="0.000651"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.619676" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.619736" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.614521" elapsed="0.005325">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:07.619963" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:07.620007" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:07.613909" elapsed="0.006122"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:07.620925" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.620342" elapsed="0.000647">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:07.620116" elapsed="0.000937">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:07.620096" elapsed="0.000989">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.621132" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.572938" elapsed="0.048292">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.621438" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.621615" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.621678" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:07.570314" elapsed="0.051463">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.621996" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.622184" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.622359" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.622555" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.622727" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:07.622895" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:07.622955" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.567770" elapsed="0.055286">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:08.653676" 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-11T00:56:08.653189" elapsed="0.000521"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:08.654180" 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-11T00:56:08.653884" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:08.654255" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:56:08.654444" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:08.652798" elapsed="0.001672"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:08.659247" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:08.659018" elapsed="0.000257"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:08.659454" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:08.660035" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:08.659825" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:08.660530" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:08.660255" elapsed="0.000318"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:08.660722" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:08.661259" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:08.661055" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:08.661767" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:08.661519" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:08.662301" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:08.661964" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:08.662747" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:08.662512" elapsed="0.000278"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:08.663219" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:08.662941" elapsed="0.000316"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:08.670191" elapsed="0.000408"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:08.679786" elapsed="0.000417"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:08.681058" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:08.680485" elapsed="0.000681"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:08.683546" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:08.682996" elapsed="0.000758">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:08.683852" elapsed="0.000053"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:08.681512" elapsed="0.002544">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.684445" elapsed="0.000025"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.684843" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.685327" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.685748" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.686117" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.686551" elapsed="0.000024"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.686880" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.687274" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.687620" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.689048" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.690065" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.691076" elapsed="0.000056"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:08.687966" elapsed="0.003213"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:08.687824" elapsed="0.003416"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.691478" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:08.691646" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:08.678982" elapsed="0.012811">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:08.691864" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:08.667774" elapsed="0.024191">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.692144" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.696825" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.697069" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:08.697136" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:08.658468" elapsed="0.038773">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:08.697355" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:08.697415" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:08.657890" elapsed="0.039550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:08.697666" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:08.697533" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:08.697511" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:08.699055" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:08.699750" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:08.699446" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:08.700751" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:08.700330" elapsed="0.000511">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:08.700904" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:08.699986" elapsed="0.001022">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.701185" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.701360" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.701571" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.701745" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.701913" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.702077" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.702242" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.702431" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.702597" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.702852" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.703026" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.703190" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:08.702723" elapsed="0.000519"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:08.702661" elapsed="0.000606"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.703424" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:08.703484" elapsed="0.000048"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:08.698507" elapsed="0.005118">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:08.703736" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:08.703780" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:08.697885" elapsed="0.005918"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:08.704643" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:08.704117" elapsed="0.000588">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:08.703884" elapsed="0.000885">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:08.703865" elapsed="0.000936">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:08.704847" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:08.657308" elapsed="0.047636">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.705122" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.705291" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:08.705352" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:08.654769" elapsed="0.050710">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.705654" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.705833" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.706004" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.706169" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.706340" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:08.706532" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:08.706595" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:08.651976" elapsed="0.054717">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:09.738261" 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-11T00:56:09.737790" elapsed="0.000506"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:09.738929" 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-11T00:56:09.738590" elapsed="0.000367"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:09.739007" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T00:56:09.739183" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:09.737375" elapsed="0.001833"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:09.744121" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:09.743930" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:09.744384" elapsed="0.000229"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:09.744990" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:09.744778" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:09.745492" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:09.745215" elapsed="0.000319"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:09.745685" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:09.746229" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:09.746025" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:09.746701" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:09.746455" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:09.747237" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:09.746898" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:09.747692" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:09.747456" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:09.748169" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:09.747889" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:09.755030" elapsed="0.000298"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:09.764661" elapsed="0.000418"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:09.765939" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:09.765344" elapsed="0.000701"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:09.768431" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:09.767888" elapsed="0.000740">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:09.768726" elapsed="0.000052"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:09.766384" elapsed="0.002541">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.769268" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.769700" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.770171" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.770592" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.770946" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.771294" elapsed="0.000066"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.771678" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.772072" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.772417" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.773831" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.774851" elapsed="0.000053"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.775860" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:09.772759" elapsed="0.003203"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:09.772600" elapsed="0.003424"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.776228" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:09.776423" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:09.763829" elapsed="0.012715">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:09.776614" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:09.752728" elapsed="0.024014">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.776927" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.781352" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.781767" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:09.781835" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:09.743366" elapsed="0.038576">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:09.782056" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:09.782099" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:09.742802" elapsed="0.039320"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:09.782337" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:09.782211" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:09.782191" elapsed="0.000232"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:09.783766" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:09.784469" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:09.784141" elapsed="0.000354"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:09.785556" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:09.785104" elapsed="0.000584">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:09.785753" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:09.784681" elapsed="0.001177">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.786034" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.786211" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.786392" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.786582" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.786750" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.786914" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.787080" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.787253" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.787435" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.787845" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.788023" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.788187" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:09.787565" elapsed="0.000674"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:09.787501" elapsed="0.000765"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.788423" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:09.788484" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:09.783178" elapsed="0.005410">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:09.788698" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:09.788741" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:09.782579" elapsed="0.006184"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:09.789421" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:09.789076" elapsed="0.000410">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:09.788843" elapsed="0.000707">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:09.788824" elapsed="0.000758">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:09.789627" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:09.742170" elapsed="0.047553">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.789900" elapsed="0.000025"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.790118" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:09.790182" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:09.739533" elapsed="0.050749">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.790480" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.790664" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.790838" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.791002" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.791173" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:09.791340" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:09.791421" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:09.736563" elapsed="0.054959">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:10.823824" 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-11T00:56:10.823347" elapsed="0.000511"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:10.824325" 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-11T00:56:10.824032" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:10.824416" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:56:10.824591" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:10.822932" elapsed="0.001684"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:10.829300" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:10.829112" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:10.829504" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:10.830064" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:10.829855" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:10.830553" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:10.830279" elapsed="0.000316"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:10.830745" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:10.831300" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:10.831078" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:10.831931" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:10.831513" elapsed="0.000461"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:10.832569" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:10.832130" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:10.833005" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:10.832769" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:10.833502" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:10.833201" elapsed="0.000327"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:10.840088" elapsed="0.000298"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:10.849562" elapsed="0.000415"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:10.850829" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:10.850239" elapsed="0.000696"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:10.853288" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:10.852786" elapsed="0.000686">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:10.853564" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:10.851264" elapsed="0.002493">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.854098" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.854526" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.854996" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.855415" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.855799" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.856146" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.856476" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.856867" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.857179" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.858616" elapsed="0.000053"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.859653" elapsed="0.000057"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.860670" elapsed="0.000053"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:10.857532" elapsed="0.003239"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:10.857355" elapsed="0.003478"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.861036" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:10.861196" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:10.848782" elapsed="0.012528">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:10.861383" elapsed="0.000040"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:10.837778" elapsed="0.023734">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.861729" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.866155" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.866357" elapsed="0.000025"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:10.866631" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:10.828568" elapsed="0.038172">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:10.866852" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:10.866895" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:10.827993" elapsed="0.038925"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:10.867119" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:10.867005" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:10.866984" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:10.868523" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:10.869191" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:10.868888" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:10.870301" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:10.869761" elapsed="0.000655">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:10.870488" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:10.869420" elapsed="0.001173">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.870770" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.870942" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.871117" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.871286" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.871468" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.871665" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.871843" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.872017" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.872181" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.872459" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.872635" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.872797" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:10.872308" elapsed="0.000578"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:10.872245" elapsed="0.000668"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.873056" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:10.873115" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:10.867968" elapsed="0.005250">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:10.873329" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:10.873372" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:10.867338" elapsed="0.006073"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:10.874022" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:10.873708" elapsed="0.000374">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:10.873493" elapsed="0.000652">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:10.873474" elapsed="0.000704">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:10.874223" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:10.827441" elapsed="0.046879">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.874528" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.874699" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:10.874761" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:10.824915" elapsed="0.049945">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.875029" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.875210" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.875385" elapsed="0.000042"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.875575" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.875778" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:10.875948" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:10.876009" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:10.822136" elapsed="0.053971">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:11.908494" 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-11T00:56:11.908071" elapsed="0.000454"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:11.908981" 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-11T00:56:11.908692" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:11.909053" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T00:56:11.909213" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:11.907681" elapsed="0.001557"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:11.914052" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:11.913868" elapsed="0.000210"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:11.914232" elapsed="0.000206"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:11.914801" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:11.914596" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:11.915258" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:11.915008" elapsed="0.000292"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:11.915466" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:11.916006" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:11.915803" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:11.916491" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:11.916230" elapsed="0.000303"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:11.917025" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:11.916688" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:11.917471" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:11.917219" elapsed="0.000296"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:11.917947" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:11.917667" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:11.924564" elapsed="0.000278"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:11.933962" elapsed="0.000408"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:11.935214" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:11.934649" elapsed="0.000668"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:11.937686" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:11.937159" elapsed="0.000666">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:11.937914" elapsed="0.000050"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:11.935664" elapsed="0.002438">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.938466" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.938858" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.939328" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.939749" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.940151" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.940532" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.940845" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.941236" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.941578" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.943076" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.944084" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.945111" elapsed="0.000055"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:11.942011" elapsed="0.003203"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:11.941755" elapsed="0.003520"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.945509" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:11.945677" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:11.933184" elapsed="0.012606">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:11.945858" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:11.922240" elapsed="0.023716">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.946134" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.950741" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.950937" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:11.951002" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:11.913312" elapsed="0.037795">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:11.951218" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:11.951261" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:11.912761" elapsed="0.038523"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:11.951498" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:11.951367" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:11.951347" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:11.952902" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:11.953643" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:11.953301" elapsed="0.000368"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:11.954634" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:11.954190" elapsed="0.000534">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:11.954786" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:11.953852" elapsed="0.001039">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.955066" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.955241" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.955435" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.955611" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.955781" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.955947" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.956115" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.956289" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.956471" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.956760" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.956937" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.957101" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:11.956629" elapsed="0.000524"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:11.956562" elapsed="0.000618"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.957322" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:11.957384" elapsed="0.000028"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:11.952316" elapsed="0.005186">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:11.957613" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:11.957657" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:11.951717" elapsed="0.005963"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:11.958289" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:11.957976" elapsed="0.000373">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:11.957760" elapsed="0.000680">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:11.957742" elapsed="0.000732">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:11.958520" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:11.912194" elapsed="0.046423">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.958832" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.959002" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:11.959065" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:11.909551" elapsed="0.049612">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.959333" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.959544" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.959718" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.959882" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.960051" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:11.960216" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:11.960277" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:11.906990" elapsed="0.053384">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:12.992770" 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-11T00:56:12.992281" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:12.993271" 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-11T00:56:12.992978" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:12.993347" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:56:12.993536" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:12.991898" elapsed="0.001664"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:12.998214" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:12.998026" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:12.998412" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:12.998967" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:12.998758" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:12.999463" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:12.999181" elapsed="0.000325"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:12.999655" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:13.000195" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:12.999991" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:13.000732" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:13.000476" elapsed="0.000297"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:13.001266" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:13.000926" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:13.001712" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:13.001477" elapsed="0.000278"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:13.002183" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:13.001905" elapsed="0.000304"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:13.008888" elapsed="0.000292"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:13.018306" elapsed="0.000450"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:13.019657" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:13.019023" elapsed="0.000750"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:13.022107" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:13.021601" elapsed="0.000651">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:13.022345" elapsed="0.000069"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:13.020102" elapsed="0.002457">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.022903" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.023301" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.023837" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.024227" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.024595" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.024945" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.025257" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.025667" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.025981" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.027334" elapsed="0.000069"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.028403" elapsed="0.000057"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.029422" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:13.026303" elapsed="0.003222"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:13.026158" elapsed="0.003429"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.029793" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:13.029960" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:13.017558" elapsed="0.012531">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:13.030159" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:13.006591" elapsed="0.023738">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.030754" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.035209" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.035424" elapsed="0.000025"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:13.035498" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:12.997482" elapsed="0.038125">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:13.035764" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:13.035810" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:12.996910" elapsed="0.038923"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:13.036057" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:13.035925" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:13.035904" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:13.037536" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:13.038221" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:13.037902" elapsed="0.000345"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:13.039429" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:13.038991" elapsed="0.000541">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:13.039593" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:13.038645" elapsed="0.001080">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.039912" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.040088" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.040266" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.040455" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.040626" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.040791" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.040956" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.041126" elapsed="0.001906"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.043194" elapsed="0.000059"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.043521" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.043699" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.043934" elapsed="0.000033"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:13.043369" elapsed="0.000646"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:13.043303" elapsed="0.000746"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.044238" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:13.044328" elapsed="0.000021"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:13.036960" elapsed="0.007540">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:13.044645" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:13.044701" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:13.036280" elapsed="0.008450"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:13.045544" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:13.045116" elapsed="0.000507">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:13.044832" elapsed="0.000871">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:13.044808" elapsed="0.000937">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:13.045804" elapsed="0.000020"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:12.996341" elapsed="0.049589">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.046159" elapsed="0.000040"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.046414" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:13.046504" elapsed="0.000020"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:12.993860" elapsed="0.052773">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.046864" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.047107" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.047335" elapsed="0.000026"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.047579" elapsed="0.000028"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.047832" elapsed="0.000027"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:13.048057" elapsed="0.000026"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:13.048135" elapsed="0.000019"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:12.991101" elapsed="0.057204">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:14.079652" 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-11T00:56:14.079140" elapsed="0.000548"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:14.080164" 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-11T00:56:14.079866" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:14.080239" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:56:14.080430" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:14.078736" elapsed="0.001721"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:14.085204" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:14.084990" elapsed="0.000241"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:14.085385" elapsed="0.000208"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:14.085958" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:14.085749" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:14.086488" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:14.086179" elapsed="0.000359"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:14.086714" elapsed="0.000185"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:14.087260" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:14.087053" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:14.087722" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:14.087475" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:14.088258" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:14.087919" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:14.088908" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:14.088474" elapsed="0.000478"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:14.089443" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:14.089107" elapsed="0.000362"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:14.096381" elapsed="0.000327"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:14.105943" elapsed="0.000419"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:14.107225" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:14.106645" elapsed="0.000686"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:14.109713" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:14.109177" elapsed="0.000688">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:14.109956" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:14.107685" elapsed="0.002468">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.110523" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.110981" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.111478" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.111878" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.112230" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.112602" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.112915" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.113325" elapsed="0.000050"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.113709" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.115044" elapsed="0.000055"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.116077" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.117096" elapsed="0.000055"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:14.114034" elapsed="0.003165"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:14.113890" elapsed="0.003372"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.117494" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:14.117661" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:14.105128" elapsed="0.012648">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:14.117846" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:14.094080" elapsed="0.023865">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.118122" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.122706" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.122906" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:14.122971" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:14.084450" elapsed="0.038631">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:14.123195" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:14.123238" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:14.083869" elapsed="0.039391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:14.123534" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:14.123407" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:14.123368" elapsed="0.000233"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:14.124913" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:14.125610" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:14.125275" elapsed="0.000361"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:14.126762" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:14.126161" elapsed="0.000689">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:14.126912" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:14.125821" elapsed="0.001194">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.127191" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.127366" elapsed="0.000036"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.127562" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.127735" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.127904" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.128068" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.128234" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.128421" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.128590" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.129003" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.129185" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.129352" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:14.128717" elapsed="0.000706"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:14.128653" elapsed="0.000801"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.129620" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:14.129680" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:14.124349" elapsed="0.005435">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:14.129895" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:14.129938" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:14.123755" elapsed="0.006205"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:14.130594" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:14.130256" elapsed="0.000398">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:14.130040" elapsed="0.000677">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:14.130022" elapsed="0.000762">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:14.130834" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:14.083300" elapsed="0.047631">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.131111" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.131279" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:14.131341" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:14.080758" elapsed="0.050713">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.131645" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.131826" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.131998" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.132162" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.132332" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:14.132525" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:14.132588" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:14.077858" elapsed="0.054828">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:15.168750" 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-11T00:56:15.168264" elapsed="0.000521"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:15.169258" 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-11T00:56:15.168961" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:15.169333" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:56:15.169522" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:15.167868" elapsed="0.001679"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:15.174283" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:15.174094" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:15.174480" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:15.175037" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:15.174829" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:15.175609" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:15.175331" elapsed="0.000322"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:15.175804" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:15.176349" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:15.176142" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:15.176812" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:15.176565" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:15.177349" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:15.177008" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:15.177822" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:15.177568" elapsed="0.000303"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:15.178523" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:15.178025" elapsed="0.000525"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:15.185120" elapsed="0.000318"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:15.194575" elapsed="0.000417"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:15.195861" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:15.195255" elapsed="0.000713"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:15.198336" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:15.197802" elapsed="0.000702">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:15.198596" elapsed="0.000050"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:15.196297" elapsed="0.002491">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.199130" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.199567" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.200026" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.200437" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.200789" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.201137" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.201469" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.201864" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.202192" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.203524" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.204546" elapsed="0.000053"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.205561" elapsed="0.000053"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:15.202526" elapsed="0.003136"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:15.202371" elapsed="0.003353"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.205925" elapsed="0.000084"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:15.206159" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:15.193783" elapsed="0.012491">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:15.206342" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:15.182833" elapsed="0.023626">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.206645" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.211068" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.211266" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:15.211332" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:15.173516" elapsed="0.038070">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:15.211702" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:15.211745" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:15.172941" elapsed="0.038826"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:15.211968" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:15.211853" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:15.211832" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:15.213335" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:15.214044" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:15.213716" elapsed="0.000355"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:15.215008" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:15.214612" elapsed="0.000484">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:15.215160" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:15.214252" elapsed="0.001011">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.215597" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.215777" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.215953" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.216124" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.216330" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.216519" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.216688" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.216861" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.217027" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.217453" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.217632" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.217797" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:15.217303" elapsed="0.000547"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:15.217091" elapsed="0.000785"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.218018" elapsed="0.000034"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:15.218092" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:15.212793" elapsed="0.005409">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:15.218313" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:15.218356" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:15.212186" elapsed="0.006193"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:15.219007" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:15.218692" elapsed="0.000375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:15.218476" elapsed="0.000652">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:15.218457" elapsed="0.000704">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:15.219207" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:15.172370" elapsed="0.046934">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.219499" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.219668" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:15.219733" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:15.169865" elapsed="0.049968">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.220007" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.220209" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.220410" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.220619" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.220790" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:15.220956" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:15.221018" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:15.167058" elapsed="0.054058">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:16.251813" 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-11T00:56:16.251322" elapsed="0.000525"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:16.252319" 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-11T00:56:16.252022" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:16.252410" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:56:16.252588" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:16.250923" elapsed="0.001690"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:16.257414" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:16.257178" elapsed="0.000264"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:16.257600" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:16.258165" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:16.257953" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:16.258679" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:16.258414" elapsed="0.000308"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:16.258872" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:16.259454" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:16.259209" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:16.259909" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:16.259656" elapsed="0.000294"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:16.260670" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:16.260107" elapsed="0.000592"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:16.261114" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:16.260872" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:16.261678" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:16.261361" elapsed="0.000344"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:16.268262" elapsed="0.000320"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:16.277790" elapsed="0.000426"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:16.279096" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:16.278502" elapsed="0.000701"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:16.281718" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:16.281147" elapsed="0.000723">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:16.281961" elapsed="0.000050"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:16.279628" elapsed="0.002527">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.282516" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.282915" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.283401" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.283797" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.284149" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.284578" elapsed="0.000023"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.284892" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.285277" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.285637" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.286886" elapsed="0.000053"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.287907" elapsed="0.000053"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.289002" elapsed="0.000053"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:16.285946" elapsed="0.003157"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:16.285809" elapsed="0.003354"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.289363" elapsed="0.000049"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:16.289571" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:16.276963" elapsed="0.012721">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:16.289753" elapsed="0.000019"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:16.265986" elapsed="0.023879">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.290045" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.294513" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.294712" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:16.294819" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:16.256626" elapsed="0.038304">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:16.295044" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:16.295089" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:16.256039" elapsed="0.039073"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:16.295322" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:16.295202" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:16.295180" elapsed="0.000228"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:16.296968" elapsed="0.000216"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:16.297701" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:16.297343" elapsed="0.000384"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:16.298664" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:16.298250" elapsed="0.000501">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:16.298813" elapsed="0.000155"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:16.297912" elapsed="0.001148">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.299236" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.299430" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.299620" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.299791" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.299958" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.300130" elapsed="0.000026"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.300305" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.300565" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.300735" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.300990" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.301162" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.301324" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:16.300861" elapsed="0.000515"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:16.300798" elapsed="0.000621"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.301587" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:16.301654" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:16.296198" elapsed="0.005560">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:16.301867" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:16.301948" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:16.295571" elapsed="0.006402"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:16.302620" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:16.302277" elapsed="0.000405">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:16.302055" elapsed="0.000690">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:16.302036" elapsed="0.000742">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:16.302823" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:16.255471" elapsed="0.047449">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.303099" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.303268" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:16.303330" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:16.252913" elapsed="0.050531">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.303616" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.303796" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.303967" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.304130" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.304297" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:16.304481" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:16.304551" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:16.250117" elapsed="0.054532">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:17.337155" 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-11T00:56:17.336685" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:17.337676" 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-11T00:56:17.337361" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:17.337750" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:56:17.337918" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:17.336278" elapsed="0.001665"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:17.342726" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:17.342537" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:17.342907" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:17.343478" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:17.343250" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:17.344197" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:17.343695" elapsed="0.000546"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:17.344419" elapsed="0.000185"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:17.344968" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:17.344762" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:17.345430" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:17.345166" elapsed="0.000306"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:17.345974" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:17.345627" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:17.346429" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:17.346175" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:17.346915" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:17.346630" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:17.353555" elapsed="0.000294"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:17.363029" elapsed="0.000433"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:17.364334" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:17.363728" elapsed="0.000731"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:17.366808" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:17.366275" elapsed="0.000678">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:17.367044" elapsed="0.000049"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:17.364790" elapsed="0.002446">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.367598" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.368028" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.368537" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.368961" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.369314" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.369685" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.370001" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.370405" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.370724" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.372071" elapsed="0.000093"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.373137" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.374157" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:17.371032" elapsed="0.003227"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:17.370896" elapsed="0.003425"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.374550" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:17.374713" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:17.362256" elapsed="0.012569">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:17.374895" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:17.351218" elapsed="0.023781">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.375178" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.379899" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.380119" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:17.380187" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:17.341984" elapsed="0.038310">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:17.380421" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:17.380466" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:17.341434" elapsed="0.039055"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:17.380690" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:17.380576" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:17.380555" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:17.382058" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:17.382748" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:17.382440" elapsed="0.000335"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:17.383893" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:17.383297" elapsed="0.000684">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:17.384068" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:17.382959" elapsed="0.001220">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.384356" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.384628" elapsed="0.000027"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.384820" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.384993" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.385164" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.385330" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.385516" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.385691" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.385857" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.386116" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.386291" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.386473" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:17.385984" elapsed="0.000544"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:17.385922" elapsed="0.000632"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.386697" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:17.386756" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:17.381515" elapsed="0.005344">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:17.386970" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:17.387015" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:17.380907" elapsed="0.006131"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:17.387667" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:17.387333" elapsed="0.000394">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:17.387118" elapsed="0.000672">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:17.387100" elapsed="0.000721">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:17.387867" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:17.340848" elapsed="0.047119">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.388172" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.388345" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:17.388423" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:17.338325" elapsed="0.050206">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.388738" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.388921" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.389094" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.389260" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.389458" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:17.389630" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:17.389692" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:17.335477" elapsed="0.054313">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:18.422964" 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-11T00:56:18.422504" elapsed="0.000493"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:18.423556" 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-11T00:56:18.423231" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:18.423631" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:56:18.423801" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:18.422100" elapsed="0.001725"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:18.428492" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:18.428286" elapsed="0.000232"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:18.428679" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:18.429229" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:18.429023" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:18.429759" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:18.429462" elapsed="0.000341"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:18.429953" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:18.430505" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:18.430285" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:18.430943" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:18.430701" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:18.431492" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:18.431138" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:18.431922" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:18.431690" elapsed="0.000276"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:18.432412" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:18.432117" elapsed="0.000321"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:18.440094" elapsed="0.000463"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:18.449744" elapsed="0.000411"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:18.451016" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:18.450439" elapsed="0.000708"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:18.453848" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:18.453249" elapsed="0.000768">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:18.454116" elapsed="0.000055"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:18.451582" elapsed="0.002739">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.454731" elapsed="0.000029"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.455152" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.455725" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.456141" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.456514" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.456877" elapsed="0.000023"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.457197" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.457614" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.457951" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.459301" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.460330" elapsed="0.000071"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.461354" elapsed="0.000074"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:18.458294" elapsed="0.003184"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:18.458144" elapsed="0.003397"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.461845" elapsed="0.000026"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:18.462020" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:18.448936" elapsed="0.013199">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:18.462203" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:18.437751" elapsed="0.024554">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.462647" elapsed="0.000024"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.467052" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.467288" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:18.467355" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:18.427749" elapsed="0.039729">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:18.467591" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:18.467634" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:18.427180" elapsed="0.040476"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:18.467882" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:18.467746" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:18.467725" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:18.469317" elapsed="0.000229"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:18.470048" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:18.469705" elapsed="0.000369"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:18.471202" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:18.470807" elapsed="0.000484">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:18.471354" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:18.470256" elapsed="0.001227">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.471658" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.471830" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.472005" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.472174" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.472340" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.472524" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.472689" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.472861" elapsed="0.000158"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.473170" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.473458" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.473635" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.473812" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:18.473297" elapsed="0.000574"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:18.473234" elapsed="0.000663"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.474039" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:18.474098" elapsed="0.000053"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:18.468775" elapsed="0.005470">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:18.474356" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:18.474436" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:18.468100" elapsed="0.006362"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:18.475095" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:18.474768" elapsed="0.000387">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:18.474549" elapsed="0.000670">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:18.474525" elapsed="0.000726">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:18.475296" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:18.426629" elapsed="0.048780">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.475590" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.475759" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:18.475820" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:18.424125" elapsed="0.051792">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.476085" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.476263" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.476459" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.476625" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.476797" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:18.476963" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:18.477023" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:18.421287" elapsed="0.055833">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:19.508813" 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-11T00:56:19.508321" elapsed="0.000527"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:19.509435" 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-11T00:56:19.509118" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:19.509511" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:56:19.509680" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:19.507931" elapsed="0.001774"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:19.514399" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:19.514183" elapsed="0.000244"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:19.514584" elapsed="0.000239"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:19.515191" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:19.514983" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:19.515682" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:19.515425" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:19.515870" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:19.518366" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:19.516202" elapsed="0.002205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:19.518852" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:19.518587" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:19.519410" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:19.519050" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:19.519851" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:19.519611" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:19.520334" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:19.520050" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:19.526934" elapsed="0.000303"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:19.536359" elapsed="0.000443"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:19.537664" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:19.537069" elapsed="0.000703"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:19.540137" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:19.539636" elapsed="0.000652">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:19.540380" elapsed="0.000073"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:19.538103" elapsed="0.002494">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.540940" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.541339" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.541845" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.542236" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.542607" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.542971" elapsed="0.000067"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.543335" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.543749" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.544060" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.545315" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.546413" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.547475" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:19.544374" elapsed="0.003205"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:19.544236" elapsed="0.003403"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.547843" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:19.548009" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:19.535606" elapsed="0.012516">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:19.548190" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:19.524646" elapsed="0.023642">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.548484" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.552915" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.553112" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:19.553177" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:19.513638" elapsed="0.039644">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:19.553436" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:19.553482" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:19.513064" elapsed="0.040441"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:19.553712" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:19.553592" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:19.553572" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:19.555141" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:19.555912" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:19.555606" elapsed="0.000332"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:19.556875" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:19.556476" elapsed="0.000529">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:19.557068" elapsed="0.041561"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:19.556121" elapsed="0.042704">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.599103" elapsed="0.000033"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.599297" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.599495" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.599673" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.599845" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.600016" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.600185" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.600360" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.600547" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.600836" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.601016" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.601183" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:19.600701" elapsed="0.000536"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:19.600620" elapsed="0.000645"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.601428" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:19.601492" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:19.554571" elapsed="0.047028">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:19.601741" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:19.601787" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:19.553932" elapsed="0.047878"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:19.602570" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:19.602150" elapsed="0.000493">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:19.601899" elapsed="0.000809">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:19.601878" elapsed="0.000863">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:19.602786" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:19.512504" elapsed="0.090379">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.603093" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.603343" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:19.603431" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:19.510003" elapsed="0.093529">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.603704" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.603884" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.604060" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.604228" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.604415" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:19.604585" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:19.604646" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:19.507129" elapsed="0.097615">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:20.643694" 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-11T00:56:20.643185" elapsed="0.000543"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:20.644200" 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-11T00:56:20.643902" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:20.644275" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:56:20.644463" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:20.642790" elapsed="0.001698"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:20.649352" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:20.649163" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:20.649549" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:20.650101" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:20.649896" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:20.650595" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:20.650318" elapsed="0.000318"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:20.650785" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:20.651366" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:20.651117" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:20.651833" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:20.651588" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:20.652471" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:20.652030" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:20.652904" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:20.652668" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:20.653378" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:20.653099" elapsed="0.000321"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:20.659998" elapsed="0.000294"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:20.669643" elapsed="0.000415"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:20.670921" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:20.670326" elapsed="0.000702"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:20.673380" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:20.672880" elapsed="0.000666">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:20.673638" elapsed="0.000050"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:20.671357" elapsed="0.002476">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.674175" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.674603" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.675073" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.675504" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.675862" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.676207" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.676537" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.676930" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.677241" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.678579" elapsed="0.000057"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.679776" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.680777" elapsed="0.000055"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:20.677572" elapsed="0.003307"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:20.677434" elapsed="0.003506"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.681144" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:20.681305" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:20.668860" elapsed="0.012574">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:20.681504" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:20.657683" elapsed="0.023921">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.681823" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.686233" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.686445" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:20.686513" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:20.648619" elapsed="0.038001">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:20.686733" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:20.686776" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:20.648042" elapsed="0.038756"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:20.687004" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:20.686885" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:20.686864" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:20.688468" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:20.689136" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:20.688834" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:20.690093" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:20.689698" elapsed="0.000482">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:20.690241" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:20.689342" elapsed="0.001002">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.690536" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.690712" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.690889" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.691062" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.691230" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.691536" elapsed="0.000024"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.691711" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.691884" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.692048" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.692306" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.692499" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.692664" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:20.692176" elapsed="0.000577"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:20.692112" elapsed="0.000668"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.692924" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:20.692983" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:20.687908" elapsed="0.005178">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:20.693197" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:20.693240" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:20.687225" elapsed="0.006038"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:20.694055" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:20.693578" elapsed="0.000538">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:20.693343" elapsed="0.000836">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:20.693325" elapsed="0.000887">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:20.694257" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:20.647489" elapsed="0.046865">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.694552" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.694722" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:20.694784" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:20.644787" elapsed="0.050093">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.695052" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.695231" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.695419" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.695603" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.695775" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:20.695942" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:20.696003" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:20.641995" elapsed="0.054106">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:21.726455" 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-11T00:56:21.725974" elapsed="0.000515"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:21.726960" 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-11T00:56:21.726662" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:21.727036" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:56:21.727243" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:21.725572" elapsed="0.001698"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:21.731979" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:21.731790" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:21.732159" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:21.732782" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:21.732522" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:21.733265" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:21.733008" elapsed="0.000299"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:21.733474" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:21.734012" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:21.733809" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:21.734464" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:21.734207" elapsed="0.000298"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:21.734994" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:21.734659" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:21.735531" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:21.735188" elapsed="0.000389"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:21.736057" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:21.735733" elapsed="0.000353"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:21.742929" elapsed="0.000340"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:21.752490" elapsed="0.000416"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:21.753783" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:21.753174" elapsed="0.000719"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:21.756303" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:21.755785" elapsed="0.000690">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:21.756571" elapsed="0.000054"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:21.754229" elapsed="0.002545">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.757113" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.757543" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.758012" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.758418" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.758842" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.759193" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.759821" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.760214" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.760561" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.761858" elapsed="0.000055"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.762888" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.763951" elapsed="0.000056"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:21.760879" elapsed="0.003178"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:21.760739" elapsed="0.003382"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.764328" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:21.764516" elapsed="0.000020"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:21.751696" elapsed="0.012978">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:21.764753" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:21.740631" elapsed="0.024232">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.765056" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.769609" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.769809" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:21.769874" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:21.731224" elapsed="0.038758">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:21.770111" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:21.770156" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:21.730649" elapsed="0.039530"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:21.770498" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:21.770274" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:21.770251" elapsed="0.000317"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:21.772012" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:21.772785" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:21.772454" elapsed="0.000357"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:21.773770" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:21.773339" elapsed="0.000534">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:21.773935" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:21.772997" elapsed="0.001043">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.774217" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.774530" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.774715" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.774887" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.775055" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.775220" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.775444" elapsed="0.000025"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.775625" elapsed="0.000176"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.775954" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.776220" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.776419" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.776590" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:21.776087" elapsed="0.000556"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:21.776021" elapsed="0.000649"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.776822" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:21.776883" elapsed="0.000020"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:21.771446" elapsed="0.005547">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:21.777105" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:21.777156" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:21.770727" elapsed="0.006453"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:21.777825" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:21.777500" elapsed="0.000385">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:21.777263" elapsed="0.000683">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:21.777245" elapsed="0.000733">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:21.778024" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:21.730077" elapsed="0.048043">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.778336" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.778526" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:21.778589" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:21.727591" elapsed="0.051097">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.778861" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.779045" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.779218" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.779427" elapsed="0.000023"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.779616" elapsed="0.000025"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:21.779808" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:21.779869" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:21.724728" elapsed="0.055240">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:22.815053" 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-11T00:56:22.814483" elapsed="0.000606"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:22.815590" 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-11T00:56:22.815272" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:22.815671" elapsed="0.000048"/>
</return>
<msg time="2026-04-11T00:56:22.815853" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:22.813972" elapsed="0.001905"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:22.820630" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:22.820431" elapsed="0.000227"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:22.820815" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:22.821369" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:22.821164" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:22.821867" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:22.821612" elapsed="0.000297"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:22.822057" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:22.822837" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:22.822406" elapsed="0.000458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:22.823362" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:22.823114" elapsed="0.000306"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:22.823924" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:22.823578" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:22.824359" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:22.824122" elapsed="0.000302"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:22.824860" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:22.824579" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:22.831461" elapsed="0.000292"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:22.841048" elapsed="0.000429"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:22.842310" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:22.841740" elapsed="0.000693"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:22.844786" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:22.844264" elapsed="0.000667">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:22.845023" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:22.842776" elapsed="0.002439">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.845581" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.845983" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.846469" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.846889" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.847243" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.847613" elapsed="0.000025"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.847933" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.848329" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.848660" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.849975" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.851007" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.852027" elapsed="0.000055"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:22.848978" elapsed="0.003153"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:22.848840" elapsed="0.003351"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.852409" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:22.852574" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:22.840277" elapsed="0.012410">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:22.852757" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:22.829139" elapsed="0.023758">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.853079" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.857761" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.857958" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:22.858025" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:22.819872" elapsed="0.038259">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:22.858242" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:22.858286" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:22.819292" elapsed="0.039016"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:22.858529" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:22.858411" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:22.858373" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:22.859922" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:22.860602" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:22.860282" elapsed="0.000345"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:22.861769" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:22.861153" elapsed="0.000709">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:22.861926" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:22.860811" elapsed="0.001218">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.862207" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.862385" elapsed="0.000035"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.862581" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.862758" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.862966" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.863132" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.863301" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.863490" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.863656" elapsed="0.000062"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.863962" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.864135" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.864298" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:22.863832" elapsed="0.000519"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:22.863766" elapsed="0.000611"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.864538" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:22.864598" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:22.859356" elapsed="0.005345">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:22.864812" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:22.864855" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:22.858748" elapsed="0.006129"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:22.865511" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:22.865178" elapsed="0.000394">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:22.864959" elapsed="0.000674">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:22.864941" elapsed="0.000724">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:22.865710" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:22.818738" elapsed="0.047069">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.865984" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.866151" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:22.866213" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:22.816179" elapsed="0.050129">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.866510" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.866697" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.866878" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.867043" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.867209" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:22.867374" elapsed="0.000035"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:22.867451" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:22.812992" elapsed="0.054590">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:23.899847" 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-11T00:56:23.899357" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:23.900347" 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-11T00:56:23.900054" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:23.900438" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:56:23.900609" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:23.898962" elapsed="0.001672"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:23.905331" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:23.905141" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:23.905528" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:23.906099" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:23.905891" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:23.906595" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:23.906315" elapsed="0.000321"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:23.906785" elapsed="0.000177"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:23.907316" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:23.907114" elapsed="0.000227"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:23.907773" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:23.907529" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:23.908302" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:23.907966" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:23.908748" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:23.908512" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:23.909224" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:23.908943" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:23.915973" elapsed="0.000303"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:23.925352" elapsed="0.000441"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:23.926684" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:23.926093" elapsed="0.000698"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:23.929133" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:23.928627" elapsed="0.000657">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:23.929379" elapsed="0.000069"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:23.927121" elapsed="0.002477">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.929951" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.930445" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.930920" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.931313" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.931690" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.932044" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.932358" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.932769" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.933081" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.934361" elapsed="0.000144"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.935471" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.936486" elapsed="0.000053"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:23.933411" elapsed="0.003176"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:23.933257" elapsed="0.003396"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.936859" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:23.937021" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:23.924600" elapsed="0.012534">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:23.937203" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:23.913673" elapsed="0.023630">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.937498" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.941939" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.942137" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:23.942202" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:23.904602" elapsed="0.037706">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:23.942566" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:23.942612" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:23.904025" elapsed="0.038610"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:23.942901" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:23.942768" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:23.942742" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:23.944287" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:23.944974" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:23.944672" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:23.945961" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:23.945540" elapsed="0.000510">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:23.946112" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:23.945182" elapsed="0.001033">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.946546" elapsed="0.000025"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.946729" elapsed="0.000024"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.946911" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.947083" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.947252" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.947434" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.947604" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.947776" elapsed="0.000159"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.948088" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.948344" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.948537" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.948703" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:23.948214" elapsed="0.000541"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:23.948152" elapsed="0.000630"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.948923" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:23.948981" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:23.943745" elapsed="0.005339">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:23.949194" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:23.949236" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:23.943125" elapsed="0.006134"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:23.949920" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:23.949572" elapsed="0.000412">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:23.949338" elapsed="0.000708">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:23.949320" elapsed="0.000792">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:23.950161" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:23.903468" elapsed="0.046790">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.950453" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.950626" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:23.950689" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:23.900934" elapsed="0.049854">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.950962" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.951142" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.951314" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.951508" elapsed="0.000022"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.951681" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:23.951849" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:23.951910" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:23.898166" elapsed="0.053844">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:24.982629" 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-11T00:56:24.982140" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:24.983191" 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-11T00:56:24.982839" elapsed="0.000386"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:24.983288" elapsed="0.000046"/>
</return>
<msg time="2026-04-11T00:56:24.983487" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:24.981717" elapsed="0.001795"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:24.988199" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:24.988008" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:24.988397" elapsed="0.000209"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:24.988980" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:24.988770" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:24.989561" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:24.989282" elapsed="0.000322"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:24.989756" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:24.990489" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:24.990093" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:24.990946" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:24.990694" elapsed="0.000295"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:24.991515" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:24.991149" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:24.991958" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:24.991715" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:24.992464" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:24.992158" elapsed="0.000332"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:24.999043" elapsed="0.000297"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:25.008515" elapsed="0.000458"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:25.009871" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:25.009239" elapsed="0.000737"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:25.012325" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:25.011818" elapsed="0.000678">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:25.012603" elapsed="0.000055"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:25.010305" elapsed="0.002500">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.013149" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.013588" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.014051" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.014464" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.014815" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.015208" elapsed="0.000023"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.015545" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.015934" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.016245" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.017653" elapsed="0.000055"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.018683" elapsed="0.000053"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.019690" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:25.016577" elapsed="0.003213"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:25.016436" elapsed="0.003419"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.020056" elapsed="0.000067"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:25.020269" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:25.007729" elapsed="0.012670">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:25.020473" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:24.996758" elapsed="0.023817">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.020775" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.026809" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.027012" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:25.027079" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:24.987466" elapsed="0.039722">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:25.027301" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:25.027344" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:24.986886" elapsed="0.040481"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:25.027604" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:25.027472" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:25.027450" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:25.029134" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:25.029998" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:25.029686" elapsed="0.000338"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:25.030975" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:25.030567" elapsed="0.000498">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:25.031128" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:25.030208" elapsed="0.001025">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.031433" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.031613" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.031791" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.031965" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.032172" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.032342" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.032531" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.032735" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.032905" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.033166" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.033340" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.033520" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:25.033035" elapsed="0.000539"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:25.032970" elapsed="0.000630"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.033744" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:25.033802" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:25.028451" elapsed="0.005456">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:25.034017" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:25.034060" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:25.027826" elapsed="0.006257"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:25.034714" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:25.034380" elapsed="0.000395">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:25.034163" elapsed="0.000674">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:25.034145" elapsed="0.000725">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:25.034915" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:24.986312" elapsed="0.048699">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.035188" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.035355" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:25.035433" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:24.983812" elapsed="0.051719">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.035701" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.035881" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.036054" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.036255" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.036454" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:25.036623" elapsed="0.000032"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:25.036697" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:24.980902" elapsed="0.055893">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:26.068942" 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-11T00:56:26.068471" elapsed="0.000506"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:26.069462" 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-11T00:56:26.069150" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:26.069536" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T00:56:26.069706" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:26.068069" elapsed="0.001661"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:26.074471" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:26.074265" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:26.074655" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:26.075225" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:26.075013" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:26.075717" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:26.075459" elapsed="0.000300"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:26.075911" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:26.076472" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:26.076247" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:26.076917" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:26.076673" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:26.077471" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:26.077114" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:26.077907" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:26.077672" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:26.078401" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:26.078106" elapsed="0.000323"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:26.085220" elapsed="0.000346"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:26.094815" elapsed="0.000442"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:26.096123" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:26.095540" elapsed="0.000687"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:26.098654" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:26.098132" elapsed="0.000677">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:26.098901" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:26.096641" elapsed="0.002467">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.099484" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.099879" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.100355" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.100765" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.101123" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.101488" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.101809" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.102199" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.102527" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.103858" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.104959" elapsed="0.000057"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.106034" elapsed="0.000063"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:26.102843" elapsed="0.003309"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:26.102702" elapsed="0.003529"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.106530" elapsed="0.000032"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:26.106747" elapsed="0.000025"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:26.094024" elapsed="0.012883">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:26.107004" elapsed="0.000038"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:26.082871" elapsed="0.024267">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.107374" elapsed="0.000256"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.112425" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.112629" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:26.112744" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:26.073721" elapsed="0.039134">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:26.112972" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:26.113015" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:26.073144" elapsed="0.039895"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:26.113265" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:26.113132" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:26.113110" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:26.114685" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:26.115579" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:26.115081" elapsed="0.000527"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:26.116567" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:26.116140" elapsed="0.000522">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:26.116724" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:26.115800" elapsed="0.001030">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.117008" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.117183" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.117360" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.117553" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.117724" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.117891" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.118057" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.118228" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.118408" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.118668" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.118839" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.119003" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:26.118538" elapsed="0.000531"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:26.118475" elapsed="0.000620"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.119236" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:26.119295" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:26.114122" elapsed="0.005292">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:26.119527" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:26.119609" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:26.113504" elapsed="0.006129"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:26.120456" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:26.119932" elapsed="0.000586">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:26.119715" elapsed="0.000867">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:26.119696" elapsed="0.000918">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:26.120660" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:26.072586" elapsed="0.048170">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.120936" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.121106" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:26.121168" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:26.070027" elapsed="0.051239">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.121462" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.121648" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.121822" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.121986" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.122156" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:26.122324" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:26.122400" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:26.067272" elapsed="0.055230">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:27.154730" 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-11T00:56:27.154231" elapsed="0.000534"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:27.155239" 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-11T00:56:27.154943" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:27.155314" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:56:27.155505" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:27.153835" elapsed="0.001696"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:27.160323" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:27.160132" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:27.160521" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:27.161077" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:27.160870" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:27.161582" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:27.161305" elapsed="0.000319"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:27.161779" elapsed="0.000185"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:27.162323" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:27.162119" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:27.162780" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:27.162537" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:27.163313" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:27.162975" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:27.163760" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:27.163523" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:27.164237" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:27.163956" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:27.171046" elapsed="0.000296"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:27.180549" elapsed="0.000422"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:27.181865" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:27.181265" elapsed="0.000704"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:27.184315" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:27.183812" elapsed="0.000671">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:27.184576" elapsed="0.000052"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:27.182302" elapsed="0.002470">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.185117" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.185561" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.186029" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.186439" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.186795" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.187144" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.187474" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.187870" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.188180" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.189532" elapsed="0.000095"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.190594" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.191613" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:27.188507" elapsed="0.003208"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:27.188355" elapsed="0.003422"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.191979" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:27.192143" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:27.179768" elapsed="0.012488">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:27.192325" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:27.168746" elapsed="0.023695">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.192620" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.197062" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.197282" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:27.197350" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:27.159587" elapsed="0.038016">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:27.197717" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:27.197761" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:27.159010" elapsed="0.038774"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:27.197994" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:27.197874" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:27.197852" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:27.199366" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:27.200046" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:27.199745" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:27.201004" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:27.200609" elapsed="0.000484">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:27.201153" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:27.200253" elapsed="0.001013">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.201606" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.201822" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.202004" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.202178" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.202348" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.202536" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.202706" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.202880" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.203045" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.203464" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.203648" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.203814" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:27.203174" elapsed="0.000694"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:27.203110" elapsed="0.000784"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.204037" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:27.204097" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:27.198825" elapsed="0.005376">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:27.204314" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:27.204357" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:27.198216" elapsed="0.006177"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:27.205008" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:27.204692" elapsed="0.000378">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:27.204476" elapsed="0.000656">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:27.204458" elapsed="0.000706">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:27.205209" elapsed="0.000043"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:27.158453" elapsed="0.046886">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.205534" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.205703" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:27.205765" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:27.155922" elapsed="0.049940">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.206071" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.206253" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.206451" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.206619" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.206788" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:27.206954" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:27.207015" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:27.152997" elapsed="0.054116">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:28.240744" 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-11T00:56:28.240248" elapsed="0.000536"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:28.241257" 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-11T00:56:28.240960" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:28.241331" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:56:28.241519" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:28.239847" elapsed="0.001697"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:28.246308" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:28.246111" elapsed="0.000223"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:28.246503" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:28.247055" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:28.246848" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:28.247560" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:28.247288" elapsed="0.000313"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:28.247750" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:28.248290" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:28.248085" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:28.248747" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:28.248500" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:28.249484" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:28.248945" elapsed="0.000565"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:28.249921" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:28.249681" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:28.250415" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:28.250117" elapsed="0.000326"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:28.256989" elapsed="0.000370"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:28.266529" elapsed="0.000418"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:28.267844" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:28.267242" elapsed="0.000710"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:28.270288" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:28.269785" elapsed="0.000681">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:28.270558" elapsed="0.000049"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:28.268282" elapsed="0.002471">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.271099" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.271549" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.272014" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.272422" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.272778" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.273130" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.273455" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.273849" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.274157" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.275535" elapsed="0.000057"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.276571" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.277619" elapsed="0.000057"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:28.274489" elapsed="0.003235"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:28.274334" elapsed="0.003455"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.278009" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:28.278176" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:28.265755" elapsed="0.012534">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:28.278358" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:28.254708" elapsed="0.023766">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.278654" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.283080" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.283333" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:28.283544" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:28.245571" elapsed="0.038083">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:28.283765" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:28.283809" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:28.244999" elapsed="0.038833"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:28.284033" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:28.283919" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:28.283898" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:28.285409" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:28.286087" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:28.285782" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:28.287044" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:28.286650" elapsed="0.000480">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:28.287214" elapsed="0.000157"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:28.286294" elapsed="0.001340">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.287814" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.287991" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.288168" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.288340" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.288528" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.288696" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.288867" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.289040" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.289203" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.289474" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.289650" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.289819" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:28.289329" elapsed="0.000542"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:28.289266" elapsed="0.000630"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.290037" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:28.290095" elapsed="0.000051"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:28.284858" elapsed="0.005385">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:28.290355" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:28.290414" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:28.284252" elapsed="0.006186"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:28.291049" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:28.290736" elapsed="0.000373">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:28.290520" elapsed="0.000651">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:28.290501" elapsed="0.000737">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:28.291288" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:28.244447" elapsed="0.046961">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.291590" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.291762" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:28.291829" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:28.241857" elapsed="0.050071">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.292099" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.292277" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.292474" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.292641" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.292809" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:28.292976" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:28.293037" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:28.238882" elapsed="0.054251">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:29.324255" 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-11T00:56:29.323777" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:29.324924" 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-11T00:56:29.324579" elapsed="0.000373"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:29.325003" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:56:29.325175" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:29.323370" elapsed="0.001830"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:29.329929" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:29.329737" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:29.330111" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:29.330682" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:29.330473" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:29.331908" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:29.330899" elapsed="0.001053"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:29.332105" elapsed="0.000186"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:29.332670" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:29.332461" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:29.333164" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:29.332899" elapsed="0.000308"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:29.333735" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:29.333364" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:29.334170" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:29.333934" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:29.334668" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:29.334366" elapsed="0.000328"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:29.341248" elapsed="0.000322"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:29.350816" elapsed="0.000416"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:29.352130" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:29.351511" elapsed="0.000738"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:29.354709" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:29.354184" elapsed="0.000681">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:29.354958" elapsed="0.000049"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:29.352604" elapsed="0.002547">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.355521" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.355922" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.356413" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.356810" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.357184" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.357557" elapsed="0.000057"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.357910" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.358303" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.358640" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.359946" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.361001" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.362023" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:29.358956" elapsed="0.003169"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:29.358815" elapsed="0.003374"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.362409" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:29.362577" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:29.350028" elapsed="0.012664">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:29.362761" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:29.338954" elapsed="0.023908">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.363040" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.367690" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.367889" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:29.367955" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:29.329162" elapsed="0.038900">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:29.368174" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:29.368217" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:29.328580" elapsed="0.039660"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:29.368464" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:29.368326" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:29.368306" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:29.369880" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:29.370558" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:29.370241" elapsed="0.000343"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:29.371693" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:29.371105" elapsed="0.000714">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:29.371885" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:29.370770" elapsed="0.001217">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.372158" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.372329" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.372521" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.372690" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.372855" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.373032" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.373197" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.373367" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.373547" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.373803" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.373979" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.374142" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:29.373673" elapsed="0.000522"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:29.373610" elapsed="0.000610"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.374360" elapsed="0.000035"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:29.374436" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:29.369313" elapsed="0.005226">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:29.374647" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:29.374690" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:29.368686" elapsed="0.006027"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:29.375312" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:29.375003" elapsed="0.000369">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:29.374791" elapsed="0.000661">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:29.374773" elapsed="0.000711">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:29.375528" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:29.328009" elapsed="0.047616">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.375800" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.376004" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:29.376068" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:29.325518" elapsed="0.050649">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.376337" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.376553" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.376725" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.376888" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.377083" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:29.377250" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:29.377310" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:29.322572" elapsed="0.054853">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:30.409272" 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-11T00:56:30.408791" elapsed="0.000515"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:30.409798" 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-11T00:56:30.409496" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:30.409886" elapsed="0.000046"/>
</return>
<msg time="2026-04-11T00:56:30.410067" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:30.408398" elapsed="0.001694"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:30.415429" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:30.415206" elapsed="0.000258"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:30.415639" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:30.416200" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:30.415992" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:30.416692" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:30.416435" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:30.416905" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:30.417473" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:30.417247" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:30.417918" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:30.417669" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:30.418843" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:30.418115" elapsed="0.000768"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:30.419395" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:30.419105" elapsed="0.000348"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:30.419906" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:30.419612" elapsed="0.000320"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:30.426753" elapsed="0.000300"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:30.436306" elapsed="0.000456"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:30.437677" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:30.437067" elapsed="0.000717"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:30.440174" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:30.439666" elapsed="0.000654">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:30.440427" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:30.438118" elapsed="0.002503">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.440967" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.441365" elapsed="0.000060"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.441869" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.442257" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.442660" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.443016" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.443332" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.443739" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.444050" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.445310" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.446524" elapsed="0.000084"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.447791" elapsed="0.000058"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:30.444376" elapsed="0.003523"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:30.444224" elapsed="0.003738"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.448193" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:30.448407" elapsed="0.000024"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:30.435513" elapsed="0.013044">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:30.448647" elapsed="0.000021"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:30.424401" elapsed="0.024380">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.449085" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.454030" elapsed="0.000042"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.454245" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:30.454313" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:30.414643" elapsed="0.039813">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:30.454602" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:30.454649" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:30.413965" elapsed="0.040708"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:30.454888" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:30.454763" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:30.454742" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:30.456519" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:30.457207" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:30.456900" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:30.458334" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:30.457915" elapsed="0.000539">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:30.458518" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:30.457572" elapsed="0.001084">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.458836" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.459012" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.459190" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.459363" elapsed="0.000037"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.459553" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.459720" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.459891" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.460063" elapsed="0.001908"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.462153" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.462446" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.462662" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.462841" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:30.462292" elapsed="0.000640"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:30.462225" elapsed="0.000735"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.463207" elapsed="0.000031"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:30.463295" elapsed="0.000021"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:30.455865" elapsed="0.007574">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:30.463572" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:30.463629" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:30.455147" elapsed="0.008507"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:30.464471" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:30.464043" elapsed="0.000491">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:30.463753" elapsed="0.000853">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:30.463731" elapsed="0.000913">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:30.464697" elapsed="0.000021"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:30.413371" elapsed="0.051453">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.465042" elapsed="0.000029"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.465250" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:30.465317" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:30.410415" elapsed="0.055018">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.465609" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.465791" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.465972" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.466137" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.466306" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:30.466489" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:30.466600" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:30.407585" elapsed="0.059127">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:31.498152" 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-11T00:56:31.497685" elapsed="0.000501"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:31.498677" 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-11T00:56:31.498363" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:31.498753" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:56:31.498929" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:31.497272" elapsed="0.001682"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:31.503701" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:31.503509" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:31.503885" elapsed="0.000231"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:31.504500" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:31.504275" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:31.504975" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:31.504717" elapsed="0.000300"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:31.505169" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:31.505730" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:31.505522" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:31.506179" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:31.505934" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:31.506732" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:31.506376" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:31.507353" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:31.506930" elapsed="0.000484"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:31.507863" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:31.507572" elapsed="0.000317"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:31.514522" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:31.524083" elapsed="0.000434"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:31.525400" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:31.524788" elapsed="0.000721"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:31.527858" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:31.527338" elapsed="0.000681">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:31.528112" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:31.525842" elapsed="0.002483">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.528695" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.529098" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.529602" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.529995" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.530445" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.530801" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.531118" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.531532" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.531846" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.533177" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.534206" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.535229" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:31.532185" elapsed="0.003148"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:31.532042" elapsed="0.003367"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.535618" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:31.535783" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:31.523264" elapsed="0.012634">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:31.535968" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:31.512201" elapsed="0.023882">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.536265" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.540871" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.541071" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:31.541137" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:31.502947" elapsed="0.038296">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:31.541355" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:31.541415" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:31.502363" elapsed="0.039077"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:31.541648" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:31.541527" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:31.541506" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:31.543211" elapsed="0.000222"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:31.543936" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:31.543629" elapsed="0.000333"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:31.544935" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:31.544537" elapsed="0.000486">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:31.545085" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:31.544177" elapsed="0.001011">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.545365" elapsed="0.000043"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.545567" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.545744" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.545917" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.546086" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.546252" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.546437" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.546612" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.546777" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.547187" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.547367" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.547555" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:31.546903" elapsed="0.000706"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:31.546840" elapsed="0.000795"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.547779" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:31.547838" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:31.542662" elapsed="0.005281">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:31.548077" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:31.548122" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:31.541867" elapsed="0.006279"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:31.548776" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:31.548458" elapsed="0.000379">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:31.548227" elapsed="0.000672">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:31.548209" elapsed="0.000722">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:31.548977" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:31.501801" elapsed="0.047273">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.549502" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.549675" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:31.549738" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:31.499257" elapsed="0.050580">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.550008" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.550188" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.550361" elapsed="0.000043"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.550555" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.550725" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:31.550893" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:31.550954" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:31.496474" elapsed="0.054578">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:32.583066" 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-11T00:56:32.582600" elapsed="0.000499"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:32.583589" 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-11T00:56:32.583276" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:32.583664" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T00:56:32.583833" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:32.582190" elapsed="0.001668"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:32.588573" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:32.588368" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:32.588757" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:32.589313" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:32.589104" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:32.589815" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:32.589559" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:32.590006" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:32.590558" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:32.590339" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:32.591088" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:32.590840" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:32.591650" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:32.591286" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:32.592088" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:32.591851" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:32.592790" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:32.592288" elapsed="0.000529"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:32.599412" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:32.609095" elapsed="0.000483"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:32.610450" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:32.609850" elapsed="0.000709"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:32.612899" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:32.612375" elapsed="0.000671">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:32.613140" elapsed="0.000052"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:32.610892" elapsed="0.002444">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.613882" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.614297" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.614824" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.615216" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.615613" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.615966" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.616278" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.616685" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.617000" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.618292" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.619392" elapsed="0.000056"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.620415" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:32.617316" elapsed="0.003201"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:32.617178" elapsed="0.003402"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.620782" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:32.620946" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:32.608319" elapsed="0.012741">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:32.621129" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:32.597093" elapsed="0.024213">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.621518" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.626001" elapsed="0.000033"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.626222" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:32.626291" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:32.587824" elapsed="0.038750">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:32.626702" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:32.626747" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:32.587250" elapsed="0.039520"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:32.627000" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:32.626863" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:32.626841" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:32.628452" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:32.629181" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:32.628855" elapsed="0.000352"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:32.630190" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:32.629769" elapsed="0.000518">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:32.630350" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:32.629424" elapsed="0.001236">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.630837" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.631012" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.631190" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.631362" elapsed="0.000037"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.631549" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.631714" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.631883" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.632058" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.632222" elapsed="0.000088"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.632762" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.632942" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.633110" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:32.632623" elapsed="0.000541"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:32.632361" elapsed="0.000830"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.633338" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:32.633437" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:32.627882" elapsed="0.005666">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:32.633660" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:32.633706" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:32.627222" elapsed="0.006507"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:32.634356" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:32.634033" elapsed="0.000400">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:32.633812" elapsed="0.000685">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:32.633793" elapsed="0.000736">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:32.634573" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:32.586700" elapsed="0.047972">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.634851" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.635019" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:32.635081" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:32.584157" elapsed="0.051023">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.635352" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.635564" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.635736" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.635901" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.636070" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:32.636236" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:32.636296" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:32.581399" elapsed="0.055047">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:33.671685" 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-11T00:56:33.671207" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:33.672192" 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-11T00:56:33.671895" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:33.672268" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:56:33.672456" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:33.670811" elapsed="0.001670"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:33.677308" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:33.677122" elapsed="0.000213"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:33.677506" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:33.678059" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:33.677852" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:33.678549" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:33.678276" elapsed="0.000335"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:33.678765" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:33.679304" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:33.679099" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:33.679770" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:33.679525" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:33.680510" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:33.679967" elapsed="0.000570"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:33.680955" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:33.680710" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:33.681462" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:33.681156" elapsed="0.000333"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:33.688029" elapsed="0.000313"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:33.697597" elapsed="0.000412"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:33.698914" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:33.698271" elapsed="0.000749"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:33.701358" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:33.700856" elapsed="0.000668">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:33.701615" elapsed="0.000049"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:33.699351" elapsed="0.002455">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.702145" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.702657" elapsed="0.000025"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.703130" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.703549" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.703904" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.704254" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.704585" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.704982" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.705293" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.706644" elapsed="0.000055"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.707669" elapsed="0.000056"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.708686" elapsed="0.000055"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:33.705622" elapsed="0.003167"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:33.705484" elapsed="0.003366"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.709055" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:33.709218" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:33.696668" elapsed="0.012662">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:33.709413" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:33.685749" elapsed="0.023765">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.709691" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.714135" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.714332" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:33.714535" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:33.676574" elapsed="0.038257">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:33.714953" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:33.714997" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:33.676002" elapsed="0.039017"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:33.715262" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:33.715143" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:33.715121" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:33.716651" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:33.717308" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:33.717009" elapsed="0.000324"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:33.718266" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:33.717872" elapsed="0.000482">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:33.718590" elapsed="0.000190"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:33.717531" elapsed="0.001352">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.719061" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.719238" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.719431" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.719606" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.719777" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.719942" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.720109" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.720284" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.720465" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.720725" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.720898" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.721061" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:33.720595" elapsed="0.000518"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:33.720531" elapsed="0.000608"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.721282" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:33.721341" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:33.716093" elapsed="0.005367">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:33.721572" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:33.721615" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:33.715500" elapsed="0.006138"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:33.722247" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:33.721932" elapsed="0.000375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:33.721717" elapsed="0.000652">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:33.721699" elapsed="0.000753">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:33.722502" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:33.675450" elapsed="0.047151">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.722829" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.722999" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:33.723061" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:33.672782" elapsed="0.050377">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.723328" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.723538" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.723711" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.723876" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.724043" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:33.724210" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:33.724270" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:33.670002" elapsed="0.054366">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:34.758802" 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-11T00:56:34.758325" elapsed="0.000511"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:34.759305" 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-11T00:56:34.759009" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:34.759394" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:56:34.759565" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:34.757936" elapsed="0.001654"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:34.764310" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:34.764117" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:34.764510" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:34.765073" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:34.764860" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:34.765830" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:34.765373" elapsed="0.000499"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:34.766023" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:34.766589" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:34.766366" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:34.767032" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:34.766787" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:34.767588" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:34.767231" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:34.768068" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:34.767827" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:34.768565" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:34.768266" elapsed="0.000326"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:34.775090" elapsed="0.000310"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:34.784534" elapsed="0.000424"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:34.785821" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:34.785222" elapsed="0.000706"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:34.788263" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:34.787761" elapsed="0.000665">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:34.788518" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:34.786258" elapsed="0.002454">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.789059" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.789487" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.789960" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.790355" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.790724" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.791071" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.791399" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.791818" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.792136" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.793628" elapsed="0.000058"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.794635" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.795643" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:34.792460" elapsed="0.003283"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:34.792309" elapsed="0.003528"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.796046" elapsed="0.000055"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:34.796244" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:34.783712" elapsed="0.012647">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:34.796445" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:34.772816" elapsed="0.023730">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.796726" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.801293" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.801505" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:34.801573" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:34.763558" elapsed="0.038121">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:34.801789" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:34.801833" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:34.762982" elapsed="0.038873"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:34.802058" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:34.801941" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:34.801920" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:34.803577" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:34.804263" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:34.803955" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:34.805220" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:34.804827" elapsed="0.000479">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:34.805368" elapsed="0.000040"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:34.804488" elapsed="0.001009">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.805669" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.805843" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.806025" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.806196" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.806423" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.806595" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.806765" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.806938" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.807105" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.807361" elapsed="0.000035"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.807552" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.807714" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:34.807232" elapsed="0.000560"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:34.807169" elapsed="0.000651"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.807962" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:34.808021" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:34.802882" elapsed="0.005243">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:34.808234" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:34.808278" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:34.802276" elapsed="0.006025"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:34.808923" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:34.808611" elapsed="0.000373">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:34.808394" elapsed="0.000652">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:34.808362" elapsed="0.000717">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:34.809124" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:34.762425" elapsed="0.046794">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.809411" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.809581" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:34.809643" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:34.759918" elapsed="0.049821">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.809909" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.810090" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.810260" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.810494" elapsed="0.000022"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.810667" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:34.810833" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:34.810895" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:34.757160" elapsed="0.053833">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:35.842927" 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-11T00:56:35.842472" elapsed="0.000488"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:35.843443" 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-11T00:56:35.843133" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:35.843518" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T00:56:35.843687" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:35.842072" elapsed="0.001639"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:35.848402" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:35.848202" elapsed="0.000228"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:35.848586" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:35.849156" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:35.848945" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:35.849662" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:35.849406" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:35.849854" elapsed="0.000184"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:35.850412" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:35.850193" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:35.850858" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:35.850613" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:35.851413" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:35.851055" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:35.851849" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:35.851613" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:35.852328" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:35.852045" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:35.859041" elapsed="0.000301"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:35.868486" elapsed="0.000447"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:35.869796" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:35.869201" elapsed="0.000703"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:35.872305" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:35.871797" elapsed="0.000671">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:35.872559" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:35.870299" elapsed="0.002453">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.873122" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.873552" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.874015" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.874427" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.874779" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.875131" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.875459" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.875850" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.876158" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.877508" elapsed="0.000055"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.878518" elapsed="0.000053"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.879694" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:35.876482" elapsed="0.003313"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:35.876329" elapsed="0.003527"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.880058" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:35.880219" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:35.867695" elapsed="0.012636">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:35.880416" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:35.856743" elapsed="0.023775">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.880696" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.885021" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.885216" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:35.885316" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:35.847658" elapsed="0.037867">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:35.885638" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:35.885681" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:35.847087" elapsed="0.038617"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:35.885904" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:35.885790" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:35.885770" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:35.887263" elapsed="0.000342"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:35.888068" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:35.887763" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:35.889054" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:35.888630" elapsed="0.000510">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:35.889202" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:35.888275" elapsed="0.001029">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.889495" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.889671" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.889847" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.890016" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.890183" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.890346" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.890528" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.890698" elapsed="0.000157"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.891005" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.891262" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.891484" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.891652" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:35.891131" elapsed="0.000574"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:35.891069" elapsed="0.000662"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.891872" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:35.891930" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:35.886721" elapsed="0.005311">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:35.892141" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:35.892232" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:35.886121" elapsed="0.006136"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:35.892915" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:35.892572" elapsed="0.000414">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:35.892338" elapsed="0.000711">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:35.892320" elapsed="0.000760">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:35.893126" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:35.846529" elapsed="0.046692">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.893414" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.893584" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:35.893646" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:35.844009" elapsed="0.049733">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.893911" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.894095" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.894265" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.894446" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.894617" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:35.894782" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:35.894842" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:35.841299" elapsed="0.053639">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:36.929504" 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-11T00:56:36.928990" elapsed="0.000550"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:36.930055" 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-11T00:56:36.929717" elapsed="0.000366"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:36.930130" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:56:36.930303" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:36.928581" elapsed="0.001747"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:36.935213" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:36.935024" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:36.935410" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:36.935976" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:36.935763" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:36.936467" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:36.936196" elapsed="0.000314"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:36.936659" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:36.939375" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:36.937009" elapsed="0.002412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:36.939934" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:36.939619" elapsed="0.000359"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:36.940508" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:36.940140" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:36.940955" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:36.940714" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:36.941460" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:36.941156" elapsed="0.000332"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:36.948172" elapsed="0.000357"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:36.957767" elapsed="0.000454"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:36.959126" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:36.958511" elapsed="0.000724"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:36.961637" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:36.961102" elapsed="0.000691">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:36.961926" elapsed="0.000055"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:36.959591" elapsed="0.002540">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.962509" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.962905" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.963425" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.963831" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.964193" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.964567" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.964883" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.965285" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.965620" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.966962" elapsed="0.000136"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.968087" elapsed="0.000056"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.969202" elapsed="0.000059"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:36.965957" elapsed="0.003356"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:36.965796" elapsed="0.003582"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.969620" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:36.969790" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:36.956981" elapsed="0.012972">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:36.970034" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:36.945785" elapsed="0.024352">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.970319" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.975169" elapsed="0.000034"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.975378" elapsed="0.000038"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:36.975462" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:36.934479" elapsed="0.041093">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:36.975686" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:36.975730" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:36.933895" elapsed="0.041858"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:36.975973" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:36.975843" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:36.975820" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:36.977364" elapsed="0.000226"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:36.978106" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:36.977749" elapsed="0.000384"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:36.979277" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:36.978871" elapsed="0.000496">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:36.979455" elapsed="0.000171"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:36.978320" elapsed="0.001398">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.979899" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.980113" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.980292" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.980483" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.980653" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.980820" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.980987" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.981181" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.981394" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.981661" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.981848" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.982042" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:36.981528" elapsed="0.000570"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:36.981464" elapsed="0.000660"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.982267" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:36.982326" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:36.976820" elapsed="0.005627">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:36.982590" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:36.982636" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:36.976198" elapsed="0.006461"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:36.983289" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:36.982963" elapsed="0.000386">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:36.982743" elapsed="0.000686">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:36.982724" elapsed="0.000740">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:36.983510" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:36.933298" elapsed="0.050308">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.983813" elapsed="0.000027"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.983997" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:36.984059" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:36.930734" elapsed="0.053424">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.984368" elapsed="0.000048"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.984582" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.984783" elapsed="0.000025"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.984961" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.985132" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:36.985301" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:36.985361" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:36.927709" elapsed="0.057772">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.018350" 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-11T00:56:38.017849" elapsed="0.000543"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.018898" 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-11T00:56:38.018596" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:38.018975" elapsed="0.000048"/>
</return>
<msg time="2026-04-11T00:56:38.019172" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T00:56:38.017444" elapsed="0.001754"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T00:56:38.023963" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T00:56:38.023773" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:38.024146" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:38.024723" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:38.024513" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.025203" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.024949" elapsed="0.000295"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:38.025398" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:38.025985" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T00:56:38.025780" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.026671" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.026184" elapsed="0.000530"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.027225" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:38.026875" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.027681" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.027442" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.028165" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:38.027878" elapsed="0.000313"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:38.034809" elapsed="0.000398"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:38.044485" elapsed="0.000417"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.045765" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:38.045167" elapsed="0.000705"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:38.048249" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.047735" elapsed="0.000687">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.048519" elapsed="0.000052"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.046208" elapsed="0.002512">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.049064" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.049502" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.049970" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.050390" elapsed="0.000039"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.050767" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.051121" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.051456" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.051854" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.052165" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.053581" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.054610" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.055620" elapsed="0.000056"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:38.052498" elapsed="0.003226"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.052340" elapsed="0.003446"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.055987" elapsed="0.000025"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.056183" elapsed="0.000022"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.043699" elapsed="0.012610">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.056384" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.032476" elapsed="0.024025">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.056680" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.061097" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.061333" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.061404" elapsed="0.000160"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.023209" elapsed="0.038449">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:38.061770" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:38.061815" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:38.022640" elapsed="0.039198"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.062047" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:38.061925" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:38.061904" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T00:56:38.063452" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.064120" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T00:56:38.063818" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:38.065088" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.064688" elapsed="0.000487">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.065237" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.064329" elapsed="0.001011">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.065682" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.065859" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.066035" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.066373" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.066563" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.066730" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.066934" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.067109" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.067273" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.067549" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.067725" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.067890" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T00:56:38.067404" elapsed="0.000537"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.067336" elapsed="0.000631"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.068110" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.068167" elapsed="0.000050"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.062894" elapsed="0.005416">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T00:56:38.068438" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T00:56:38.068484" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:38.062267" elapsed="0.006240"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.069121" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.068807" elapsed="0.000374">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:38.068589" elapsed="0.000656">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T00:56:38.068570" elapsed="0.000707">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.069322" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.022061" elapsed="0.047374">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.069616" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.069784" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.069846" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T00:56:38.019524" elapsed="0.050421">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.070115" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.070295" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.070492" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.070659" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.070828" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.071017" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.071080" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.016594" elapsed="0.054584">Could not parse owner and candidates for device openflow:1</status>
</kw>
<msg time="2026-04-11T00:56:38.071279" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.543439" elapsed="30.527931">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.071498" elapsed="0.000016"/>
</return>
<arg>openflow:1</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.541224" elapsed="30.530375">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<msg time="2026-04-11T00:56:38.071684" level="FAIL">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device</arg>
<arg>openflow:1</arg>
<arg>1</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.533171" elapsed="30.538602">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<doc>Check Entity Owner Status and identify owner and successor for first switch s1.</doc>
<status status="FAIL" start="2026-04-11T00:56:07.520995" elapsed="30.550949">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</test>
<test id="s1-s4-t20" name="Add Flows And Groups After Owner Reconnect" line="157">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:56:38.076026" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:56:38.075757" elapsed="0.000534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.077282" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:38.077173" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:38.077154" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.082134" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:38.082029" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:38.082011" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.083192" 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-11T00:56:38.082815" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.083709" 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-11T00:56:38.083408" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:38.083780" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:56:38.083935" 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-11T00:56:38.082442" 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-11T00:56:38.084307" 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-11T00:56:38.084581" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:38.084430" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:56:38.084390" elapsed="0.000267"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:56:38.084165" elapsed="0.000516"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.084014" elapsed="0.000691"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:56:38.081674" elapsed="0.003083"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:56:38.076889" elapsed="0.007921"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:38.076461" elapsed="0.008394"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:56:38.073211" elapsed="0.011694"/>
</kw>
<kw name="Add Single Group And Flow On Member">
<kw name="Add Groups And Flows On Member">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.086651" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:38.086332" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:38.086778" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:56:38.086930" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:38.085989" elapsed="0.000965"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.089845" level="INFO">&amp;{mapping} = { NODE=openflow:1 }</msg>
<var>&amp;{mapping}</var>
<arg>NODE=openflow:${switch}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:56:38.089447" elapsed="0.000427"/>
</kw>
<kw name="Post_As_Json_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.132101" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:38.131732" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T00:56:38.133034" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.132653" elapsed="0.000448">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-11T00:56:38.133195" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T00:56:38.132296" elapsed="0.000924"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.133796" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:56:38.133391" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-11T00:56:38.134126" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-11T00:56:38.134290" level="INFO">${template} = /rests/data/opendaylight-inventory:nodes/node=$NODE
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-11T00:56:38.133989" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.134739" level="INFO">/rests/data/opendaylight-inventory:nodes/node=$NODE
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.134493" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.136081" level="INFO">mapping: {'NODE': 'openflow:1'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.135477" elapsed="0.000652"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.136720" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T00:56:38.136292" elapsed="0.000456"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.137850" level="INFO">${value} = openflow:1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-11T00:56:38.137173" elapsed="0.000718"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-11T00:56:38.139543" level="INFO">${encoded} = openflow%3A1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-11T00:56:38.139150" elapsed="0.000427"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-11T00:56:38.139652" elapsed="0.000071"/>
</return>
<msg time="2026-04-11T00:56:38.139979" level="INFO">${encoded_value} = openflow%3A1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-11T00:56:38.138344" elapsed="0.001679"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:38.140246" elapsed="0.000538"/>
</kw>
<var name="${key}">NODE</var>
<var name="${value}">openflow:1</var>
<status status="PASS" start="2026-04-11T00:56:38.137001" elapsed="0.003905"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-11T00:56:38.136819" elapsed="0.004127"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-11T00:56:38.140990" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:56:38.141148" level="INFO">${mapping_to_use} = {'NODE': 'openflow%3A1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-11T00:56:38.135141" elapsed="0.006032"/>
</kw>
<status status="PASS" start="2026-04-11T00:56:38.134850" elapsed="0.006354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.141379" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:38.141229" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:38.134831" elapsed="0.006644"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.142176" level="INFO">${final_text} = /rests/data/opendaylight-inventory:nodes/node=openflow%3A1</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:56:38.141622" elapsed="0.000582"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T00:56:38.142301" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="PASS" start="2026-04-11T00:56:38.131108" elapsed="0.011336"/>
</kw>
<msg time="2026-04-11T00:56:38.142499" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T00:56:38.118746" elapsed="0.023803"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.154861" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.166916" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.179034" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.179232" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.179427" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.179793" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:38.179647" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:56:38.179633" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.180014" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.180181" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.180347" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-11T00:56:38.179604" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.179504" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.180593" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.180668" elapsed="0.000015"/>
</return>
<msg time="2026-04-11T00:56:38.180785" level="INFO">${uri} = /rests/data/opendaylight-inventory:nodes/node=openflow%3A1</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one 1 times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-11T00:56:38.114521" elapsed="0.066290"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T00:56:38.191972" elapsed="0.000356"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.205651" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/post_data.prolog.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:38.205258" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T00:56:38.206442" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/post_data.prolog.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.206184" elapsed="0.000331">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/post_data.prolog.json' does not exist.</status>
</kw>
<msg time="2026-04-11T00:56:38.206629" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T00:56:38.205843" elapsed="0.000811"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.207206" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/post_data.prolog.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:56:38.206820" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-11T00:56:38.207555" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/post_data.prolog.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/post_data.prolog.json&lt;/a&gt;'.</msg>
<msg time="2026-04-11T00:56:38.207702" level="INFO">${template} = {
  "flow-node-inventory:group": [
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-11T00:56:38.207399" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.208128" level="INFO">{
  "flow-node-inventory:group": [
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.207884" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-11T00:56:38.208549" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:38.208239" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.209072" level="INFO">${mapping_to_use} = {'NODE': 'openflow:1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:38.208782" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-11T00:56:38.208634" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:38.208219" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.209751" level="INFO">${final_text} = {
  "flow-node-inventory:group": [</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:56:38.209300" elapsed="0.000477"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T00:56:38.209826" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:56:38.209978" level="INFO">${prolog} = {
  "flow-node-inventory:group": [</msg>
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="PASS" start="2026-04-11T00:56:38.204645" elapsed="0.005357"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.223136" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/post_data.epilog.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:38.222752" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T00:56:38.223887" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/post_data.epilog.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.223678" elapsed="0.000272">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/post_data.epilog.json' does not exist.</status>
</kw>
<msg time="2026-04-11T00:56:38.224042" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T00:56:38.223327" elapsed="0.000739"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.224630" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/post_data.epilog.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:56:38.224230" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-11T00:56:38.224997" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/post_data.epilog.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/post_data.epilog.json&lt;/a&gt;'.</msg>
<msg time="2026-04-11T00:56:38.225120" level="INFO">${template} =   ]
}
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-11T00:56:38.224863" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.225564" level="INFO">  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.225300" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-11T00:56:38.225961" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:38.225675" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.226495" level="INFO">${mapping_to_use} = {'NODE': 'openflow:1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:38.226188" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-11T00:56:38.226043" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:38.225656" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.227169" level="INFO">${final_text} =   ]
}</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:56:38.226724" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T00:56:38.227244" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:56:38.227392" level="INFO">${epilog} =   ]
}</msg>
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="PASS" start="2026-04-11T00:56:38.222124" elapsed="0.005310"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.240694" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/data.item.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:38.240298" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T00:56:38.241446" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/data.item.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.241223" elapsed="0.000286">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/data.item.json' does not exist.</status>
</kw>
<msg time="2026-04-11T00:56:38.241602" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T00:56:38.240887" elapsed="0.000738"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.242164" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/data.item.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:56:38.241789" elapsed="0.000402"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-11T00:56:38.242505" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/data.item.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/data.item.json&lt;/a&gt;'.</msg>
<msg time="2026-04-11T00:56:38.242629" level="INFO">${template} =         {
          "group-id": ${i}000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
       ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-11T00:56:38.242351" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.243052" level="INFO">        {
          "group-id": ${i}000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-${i}",
          "group-type": "group-select"
        }
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.242812" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-11T00:56:38.243467" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:38.243163" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.244061" level="INFO">${mapping_to_use} = {'NODE': 'openflow:1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:38.243736" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-11T00:56:38.243587" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:38.243144" elapsed="0.001000"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.244890" level="INFO">${final_text} =         {
          "group-id": ${i}000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
       ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:56:38.244290" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T00:56:38.244966" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:56:38.245119" level="INFO">${item_template} =         {
          "group-id": ${i}000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
       ...</msg>
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="PASS" start="2026-04-11T00:56:38.239756" elapsed="0.005389"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.245570" level="INFO">${items} = []</msg>
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T00:56:38.245310" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.246116" level="INFO">${separator} = ,
</msg>
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:56:38.245756" elapsed="0.000385"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.246774" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:38.246537" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:38.246523" elapsed="0.000333"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.247343" level="INFO">${j} = 1</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:56:38.246998" elapsed="0.000371"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.248136" level="INFO">${item} =         {
          "group-id": 1000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
          ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T00:56:38.247543" elapsed="0.000622"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T00:56:38.248321" elapsed="0.000219"/>
</kw>
<var name="${iteration}">1</var>
<status status="PASS" start="2026-04-11T00:56:38.246491" elapsed="0.002087"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="PASS" start="2026-04-11T00:56:38.246196" elapsed="0.002412"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.249188" level="INFO">${final_text} = {
  "flow-node-inventory:group": [
        {
          "group-id": 1000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
   ...</msg>
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-11T00:56:38.248763" elapsed="0.000453"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T00:56:38.249273" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:56:38.249441" level="INFO">${data} = {
  "flow-node-inventory:group": [
        {
          "group-id": 1000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
   ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one 1 times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-11T00:56:38.191086" elapsed="0.058383"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T00:56:38.250704" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.250472" elapsed="0.000294">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-11T00:56:38.250856" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T00:56:38.250124" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.251231" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:38.250950" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.251840" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:38.251521" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-11T00:56:38.251315" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:38.250932" elapsed="0.000992"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.254385" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T00:56:38.252077" elapsed="0.002347"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-11T00:56:38.254477" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:56:38.254631" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-11T00:56:38.249803" elapsed="0.004853"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.256182" level="INFO">/rests/data/opendaylight-inventory:nodes/node=openflow%3A1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.255938" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.256634" level="INFO">{
  "flow-node-inventory:group": [
        {
          "group-id": 1000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-1",
          "group-type": "group-select"
        }
  ]
}</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.256381" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.257073" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.256833" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.257524" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.257267" elapsed="0.000300"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-11T00:56:38.258364" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-11T00:56:38.258166" elapsed="0.000229"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-11T00:56:38.258739" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-11T00:56:38.258568" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T00:56:38.258915" elapsed="0.000187"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.259522" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T00:56:38.259260" elapsed="0.000307"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-11T00:56:38.259610" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:56:38.259762" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-11T00:56:38.257766" elapsed="0.002020"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:38.262237" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.261951" elapsed="0.000677">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<status status="FAIL" start="2026-04-11T00:56:38.259855" elapsed="0.002858">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.262895" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:38.262744" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-11T00:56:38.259838" elapsed="0.003145">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.263348" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.263498" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:38.263462" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:56:38.263444" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.263702" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.263769" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.254980" elapsed="0.008892">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.263990" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=json</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.103783" elapsed="0.160322">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.264403" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:38.264221" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:56:38.264205" elapsed="0.000302"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.264539" elapsed="0.000013"/>
</return>
<arg>folder=${VAR_DIR}/add-group-1</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>iterations=${iter}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.101198" elapsed="0.163436">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Post_As_Json_Templated" owner="TemplatedRequests">
<arg>folder=${VAR_DIR}/add-group-2</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>iterations=${iter}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.275944" elapsed="0.000027"/>
</kw>
<kw name="Post_As_Json_Templated" owner="TemplatedRequests">
<arg>folder=${VAR_DIR}/add-flow</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>iterations=${iter}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.287105" elapsed="0.000027"/>
</kw>
<var name="${switch}">1</var>
<status status="FAIL" start="2026-04-11T00:56:38.089280" elapsed="0.197916">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="FAIL" start="2026-04-11T00:56:38.087004" elapsed="0.200254">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</for>
<arg>1</arg>
<arg>${member_index}</arg>
<doc>Add 100 groups type 1 &amp; 2 and flows in every switch.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.085594" elapsed="0.201762">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Add 1 group 1&amp;2 and 1 flow in every switch.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.085035" elapsed="0.202434">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Add 1 group type 1&amp;2 and 1 flow in every switch.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.072597" elapsed="0.215019">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t21" name="Check Stats Are Not Frozen After Owner Reconnect" line="161">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:56:38.290965" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:56:38.290701" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.292218" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:38.292109" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:38.292091" 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-11T00:56:38.297030" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:56:38.296924" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T00:56:38.296905" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.298089" 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-11T00:56:38.297714" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.298575" 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-11T00:56:38.298275" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:56:38.298646" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:56:38.298844" 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-11T00:56:38.297322" elapsed="0.001546"/>
</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-11T00:56:38.299214" 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-11T00:56:38.299475" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:56:38.299310" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:56:38.299294" elapsed="0.000260"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:56:38.299071" elapsed="0.000506"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.298920" elapsed="0.000681"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:56:38.296556" elapsed="0.003096"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:56:38.291826" elapsed="0.007880"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:56:38.291387" elapsed="0.008363"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:56:38.288580" elapsed="0.011220"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:38.301930" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:38.301637" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:38.302002" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:56:38.302147" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:38.301261" elapsed="0.000910"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:38.302792" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.302327" elapsed="0.000791">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.303329" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.303577" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.303755" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.303924" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.304094" elapsed="0.000019"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:38.304158" elapsed="0.000015"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.300774" elapsed="0.003485">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.304439" elapsed="0.000022"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.304612" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.304791" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.304963" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:38.305171" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.300447" elapsed="0.004831">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:39.309839" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:39.308976" elapsed="0.000938"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:39.310179" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:56:39.310630" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:39.308079" elapsed="0.002613"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:39.311784" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:39.311077" elapsed="0.001542">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:39.313114" elapsed="0.000053"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:39.313671" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:39.314068" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:39.314541" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:39.314930" elapsed="0.000045"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:39.315085" elapsed="0.000040"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:39.307178" elapsed="0.008079">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:39.315439" elapsed="0.000022"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:39.315613" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:39.315794" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:39.315971" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:39.316174" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:39.306157" elapsed="0.010126">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:40.319172" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:40.318687" elapsed="0.000533"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:40.319300" elapsed="0.000053"/>
</return>
<msg time="2026-04-11T00:56:40.319551" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:40.318144" elapsed="0.001442"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:40.320203" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:40.319808" elapsed="0.001257">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:40.321372" elapsed="0.000054"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:40.321728" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:40.321979" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:40.322217" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:40.322476" elapsed="0.000030"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:40.322571" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:40.317625" elapsed="0.005093">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:40.322951" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:40.323187" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:40.323471" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:40.323809" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:40.324088" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:40.316968" elapsed="0.007272">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:41.328429" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:41.327624" elapsed="0.000879"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:41.328622" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:56:41.328977" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:41.326774" elapsed="0.002260"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:41.330047" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:41.329392" elapsed="0.001429">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:41.331280" elapsed="0.000048"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:41.331835" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:41.332288" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:41.332708" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:41.333081" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:41.333174" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:41.325920" elapsed="0.007400">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:41.333570" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:41.333804" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:41.334052" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:41.334294" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:41.334596" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:41.324962" elapsed="0.009786">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:42.338878" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:42.338106" elapsed="0.000842"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:42.339062" elapsed="0.000075"/>
</return>
<msg time="2026-04-11T00:56:42.339436" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:42.337254" elapsed="0.002243"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:42.340494" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:42.339848" elapsed="0.001383">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:42.341773" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:42.344779" elapsed="0.000039"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:42.345081" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:42.345338" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:42.345678" elapsed="0.000031"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:42.345861" elapsed="0.000025"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:42.336455" elapsed="0.009566">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:42.346261" elapsed="0.000031"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:42.346528" elapsed="0.000031"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:42.346796" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:42.347048" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:42.347339" elapsed="0.000030"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:42.335553" elapsed="0.011965">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:43.351785" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:43.351005" elapsed="0.000851"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:43.351973" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:56:43.352328" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:43.350169" elapsed="0.002221"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:43.353341" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:43.352816" elapsed="0.001081">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:43.354208" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:43.354578" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:43.354885" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:43.355148" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:43.355420" elapsed="0.000031"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:43.355520" elapsed="0.000024"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:43.349287" elapsed="0.006390">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:43.355917" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:43.356163" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:43.356452" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:43.356723" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:43.357010" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:43.348298" elapsed="0.008866">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:44.361363" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:44.360619" elapsed="0.000849"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:44.361587" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:56:44.361988" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:44.359783" elapsed="0.002263"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:44.363057" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:44.362435" elapsed="0.001402">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:44.364450" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:44.364976" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:44.365375" elapsed="0.000079"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:44.365798" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:44.366228" elapsed="0.000025"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:44.366306" elapsed="0.000015"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:44.358931" elapsed="0.007496">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:44.366594" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:44.366761" elapsed="0.000021"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:44.366943" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:44.367114" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:44.367308" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:44.357985" elapsed="0.009448">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:45.372492" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:45.371590" elapsed="0.000994"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:45.372704" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:56:45.373061" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:45.370707" elapsed="0.002428"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:45.374252" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:45.373603" elapsed="0.001456">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:45.375611" elapsed="0.000057"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:45.376231" elapsed="0.000072"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:45.376781" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:45.377179" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:45.377662" elapsed="0.000056"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:45.377825" elapsed="0.000038"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:45.369844" elapsed="0.008220">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:45.378335" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:45.378522" elapsed="0.000021"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:45.378704" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:45.378876" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:45.379070" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:45.368895" elapsed="0.010284">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:46.383595" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:46.382771" elapsed="0.001022"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:46.383948" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T00:56:46.384334" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:46.381870" elapsed="0.002555"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:46.385497" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:46.384808" elapsed="0.001431">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:46.386740" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:46.387255" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:46.387681" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:46.388116" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:46.388379" elapsed="0.000035"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:46.388459" elapsed="0.000016"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:46.380975" elapsed="0.007591">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:46.388729" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:46.388895" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:46.389074" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:46.389243" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:46.389455" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:46.379992" elapsed="0.009570">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:47.394590" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:47.393706" elapsed="0.000957"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:47.394779" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:56:47.395142" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:47.392799" elapsed="0.002401"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:47.396297" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:47.395640" elapsed="0.001639">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:47.397605" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:47.397948" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:47.398264" elapsed="0.000038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:47.398615" elapsed="0.000038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:47.398915" elapsed="0.000031"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:47.399011" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:47.391247" elapsed="0.007915">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:47.399427" elapsed="0.000032"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:47.399701" elapsed="0.000037"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:47.400074" elapsed="0.000033"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:47.400324" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:47.400633" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:47.390260" elapsed="0.010524">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:48.405137" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:48.404297" elapsed="0.000920"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:48.405306" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T00:56:48.405560" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:48.403454" elapsed="0.002142"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:48.406215" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:48.405818" elapsed="0.000919">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:48.407033" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:48.407389" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:48.407665" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:48.407905" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:48.408145" elapsed="0.000027"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:48.408234" elapsed="0.000025"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:48.402607" elapsed="0.005813">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:48.408662" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:48.408898" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:48.409176" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:48.409438" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:48.409715" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:48.401651" elapsed="0.008216">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:49.414976" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:49.414185" elapsed="0.000861"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:49.415164" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:56:49.415557" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:49.412757" elapsed="0.002859"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:49.416598" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:49.415973" elapsed="0.001136">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:49.417438" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:49.417766" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:49.418012" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:49.418261" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:49.418611" elapsed="0.000030"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:49.418705" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:49.411745" elapsed="0.007126">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:49.419103" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:49.419338" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:49.419621" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:49.419864" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:49.420168" elapsed="0.000030"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:49.410620" elapsed="0.009702">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:50.424529" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:50.423754" elapsed="0.000845"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:50.424715" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:56:50.425064" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:50.422914" elapsed="0.002206"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:50.426132" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:50.425509" elapsed="0.001462">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:50.427419" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:50.427748" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:50.427997" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:50.428235" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:50.428503" elapsed="0.000038"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:50.428610" elapsed="0.000025"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:50.422029" elapsed="0.006728">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:50.429002" elapsed="0.000028"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:50.429231" elapsed="0.000027"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:50.429510" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:50.429753" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:50.430022" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:50.421067" elapsed="0.009103">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:51.434469" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:51.433650" elapsed="0.000893"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:51.434658" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:56:51.435015" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:51.432799" elapsed="0.002272"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:51.436686" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:51.435459" elapsed="0.002005">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:51.438040" elapsed="0.000052"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:51.438598" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:51.438998" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:51.439420" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:51.439809" elapsed="0.000086"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:51.440003" elapsed="0.000037"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:51.431908" elapsed="0.008328">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:51.440580" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:51.440815" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:51.441066" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:51.441307" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:51.441602" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:51.430927" elapsed="0.010826">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:52.446267" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:52.445455" elapsed="0.000887"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:52.446503" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T00:56:52.446891" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:52.444469" elapsed="0.002482"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:52.448040" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:52.447330" elapsed="0.001596">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:52.449373" elapsed="0.000039"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:52.449627" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:52.449808" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:52.449979" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:52.450150" elapsed="0.000021"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:52.450216" elapsed="0.000017"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:52.443549" elapsed="0.006776">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:52.450511" elapsed="0.000022"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:52.450683" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:52.450865" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:52.451040" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:52.451238" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:52.442545" elapsed="0.008808">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:53.455834" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:53.455044" elapsed="0.000862"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:53.456025" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:56:53.456410" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:53.454186" elapsed="0.002284"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:53.457497" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:53.456824" elapsed="0.001528">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:53.458677" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:53.459004" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:53.459252" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:53.459516" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:53.459759" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:53.459851" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:53.453286" elapsed="0.006712">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:53.460229" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:53.460486" elapsed="0.000031"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:53.460742" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:53.460986" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:53.461283" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:53.452088" elapsed="0.009372">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:54.465963" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:54.465135" elapsed="0.000898"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:54.466150" elapsed="0.000182"/>
</return>
<msg time="2026-04-11T00:56:54.466661" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:54.464163" elapsed="0.002557"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:54.467798" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:54.467080" elapsed="0.001607">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:54.469225" elapsed="0.000058"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:54.469643" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:54.469898" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:54.470140" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:54.470405" elapsed="0.000031"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:54.470500" elapsed="0.000025"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:54.463213" elapsed="0.007440">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:54.470885" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:54.471231" elapsed="0.000030"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:54.471549" elapsed="0.000035"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:54.471800" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:54.472125" elapsed="0.000036"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:54.462183" elapsed="0.010111">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:55.476500" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:55.475673" elapsed="0.000902"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:55.476690" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:56:55.477045" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:55.474807" elapsed="0.002295"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:55.477895" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:55.477485" elapsed="0.000953">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:55.478735" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:55.479060" elapsed="0.000375"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:55.479667" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:55.479912" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:55.480154" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:55.480246" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:55.473961" elapsed="0.006456">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:55.480673" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:55.480917" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:55.481170" elapsed="0.000029"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:55.481433" elapsed="0.000041"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:55.481720" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:55.473005" elapsed="0.008864">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:56.486053" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:56.485271" elapsed="0.000850"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:56.486234" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:56:56.486624" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:56.484439" elapsed="0.002242"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:56.487776" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:56.487034" elapsed="0.001548">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:56.488882" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:56.489209" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:56.489483" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:56.489838" elapsed="0.000032"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:56.490086" elapsed="0.000031"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:56.490182" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:56.483567" elapsed="0.006766">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:56.490595" elapsed="0.000031"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:56.490858" elapsed="0.000033"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:56.491124" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:56.491373" elapsed="0.000052"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:56.491705" elapsed="0.000032"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:56.482629" elapsed="0.009237">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:57.496178" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:57.495352" elapsed="0.000900"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:57.496374" elapsed="0.000114"/>
</return>
<msg time="2026-04-11T00:56:57.496788" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:57.494486" elapsed="0.002362"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:57.497932" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:57.497228" elapsed="0.001442">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:57.498969" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:57.499293" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:57.499570" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:57.499814" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:57.500051" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:57.500143" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:57.493553" elapsed="0.006735">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:57.500540" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:57.500774" elapsed="0.000352"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:57.501359" elapsed="0.000050"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:57.501629" elapsed="0.000030"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:57.501907" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:57.492594" elapsed="0.009467">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:58.506528" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:58.505691" elapsed="0.000914"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:58.506729" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T00:56:58.507110" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:58.504779" elapsed="0.002392"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:58.508254" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:58.507581" elapsed="0.001678">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:58.509778" elapsed="0.000053"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:58.510297" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:58.510729" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:58.511114" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:58.511522" elapsed="0.000047"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:58.511669" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:58.503822" elapsed="0.008082">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:58.512269" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:58.512678" elapsed="0.000046"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:58.513173" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:58.513618" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:58.514058" elapsed="0.000045"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:58.502845" elapsed="0.011455">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:56:59.518693" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:56:59.517875" elapsed="0.000891"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:56:59.518890" elapsed="0.000156"/>
</return>
<msg time="2026-04-11T00:56:59.519421" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:56:59.516982" elapsed="0.002503"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:56:59.520116" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:56:59.519711" elapsed="0.000938">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:59.520944" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:56:59.521269" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:59.521537" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:59.521780" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:59.522021" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:56:59.522111" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:59.516081" elapsed="0.006177">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:59.522510" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:59.522743" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:59.523004" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:59.523243" elapsed="0.000370"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:56:59.523875" elapsed="0.000030"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:56:59.515103" elapsed="0.008926">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:00.528270" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:00.527526" elapsed="0.000816"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:00.528490" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:57:00.528854" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:00.526692" elapsed="0.002219"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:00.529831" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:00.529317" elapsed="0.001032">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:00.530671" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:57:00.530998" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:00.531249" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:00.531519" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:00.531768" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:57:00.531860" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:00.525850" elapsed="0.006161">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:00.532241" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:00.532499" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:00.532754" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:00.533014" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:00.533290" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:00.524883" elapsed="0.008581">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:01.537616" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:01.536842" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:01.537799" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:57:01.538155" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:01.535998" elapsed="0.002214"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:01.539236" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:01.538594" elapsed="0.001418">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:01.540503" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:57:01.541017" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:01.541438" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:01.541823" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:01.542197" elapsed="0.000044"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:57:01.542340" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:01.535152" elapsed="0.007450">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:01.543170" elapsed="0.000051"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:01.543593" elapsed="0.000055"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:01.543873" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:01.544046" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:01.544243" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:01.534189" elapsed="0.010163">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:02.549062" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:02.548211" elapsed="0.000923"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:02.549249" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:57:02.549645" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:02.547378" elapsed="0.002324"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:02.550717" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:02.550057" elapsed="0.001448">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:02.551963" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:57:02.552532" elapsed="0.000059"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:02.552935" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:02.553321" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:02.553730" elapsed="0.000045"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:57:02.553877" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:02.546571" elapsed="0.007537">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:02.554503" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:02.554878" elapsed="0.000044"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:02.555277" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:02.555697" elapsed="0.000045"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:02.556131" elapsed="0.000045"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:02.545061" elapsed="0.011309">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:03.558951" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:03.558580" elapsed="0.000404"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:03.559049" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:57:03.559216" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:03.558188" elapsed="0.001053"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:03.559704" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:03.559414" elapsed="0.000669">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:03.560296" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:57:03.560545" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:03.560722" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:03.560980" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:03.561152" elapsed="0.000021"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:57:03.561218" elapsed="0.000016"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:03.557787" elapsed="0.003539">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:03.561506" elapsed="0.000022"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:03.561681" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:03.561862" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:03.562063" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:03.562271" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:03.557129" elapsed="0.005249">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:04.566976" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:04.566217" elapsed="0.000825"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:04.567156" elapsed="0.000074"/>
</return>
<msg time="2026-04-11T00:57:04.567573" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:04.565374" elapsed="0.002246"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:04.568275" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:04.567855" elapsed="0.000962">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:04.569126" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:57:04.569489" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:04.569754" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:04.570005" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:04.570252" elapsed="0.000030"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:57:04.570347" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:04.564566" elapsed="0.005957">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:04.570765" elapsed="0.000031"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:04.571011" elapsed="0.000030"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:04.571280" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:04.571568" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:04.571860" elapsed="0.000030"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:04.563086" elapsed="0.008933">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:05.576263" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:05.575471" elapsed="0.000862"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:05.576486" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:57:05.576919" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:05.574630" elapsed="0.002347"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:05.578161" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:05.577518" elapsed="0.001461">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:05.579515" elapsed="0.000056"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:57:05.580093" elapsed="0.000058"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:05.580545" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:05.580998" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:05.581379" elapsed="0.000076"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:57:05.581559" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:05.573778" elapsed="0.007958">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:05.581901" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:05.582069" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:05.582252" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:05.582442" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:05.582645" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:05.572824" elapsed="0.009930">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:06.587313" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:06.586588" elapsed="0.000792"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:06.587532" elapsed="0.000075"/>
</return>
<msg time="2026-04-11T00:57:06.587880" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:06.585687" elapsed="0.002248"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:06.588940" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:06.588285" elapsed="0.001424">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:06.590185" elapsed="0.000052"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:57:06.590735" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:06.591131" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:06.591540" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:06.591921" elapsed="0.000044"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:57:06.592064" elapsed="0.000034"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:06.584318" elapsed="0.007975">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:06.592684" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:06.593057" elapsed="0.000044"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:06.593475" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:06.593971" elapsed="0.000057"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:06.594457" elapsed="0.000148"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:06.583457" elapsed="0.011293">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:07.598759" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:07.598001" elapsed="0.000829"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:07.598993" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:57:07.599347" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:07.597169" elapsed="0.002263"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:07.600173" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:07.599753" elapsed="0.000955">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:07.601020" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:57:07.601362" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:07.601647" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:07.601900" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:07.602150" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:57:07.602246" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:07.596334" elapsed="0.006086">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:07.602667" elapsed="0.000031"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:07.602914" elapsed="0.000045"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:07.603197" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:07.603471" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:07.603766" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:07.595458" elapsed="0.008464">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:08.610202" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:08.609710" elapsed="0.000538"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:08.610326" elapsed="0.000052"/>
</return>
<msg time="2026-04-11T00:57:08.610576" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:08.606509" elapsed="0.004102"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:08.611232" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:08.610835" elapsed="0.000919">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.612066" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.612411" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.612664" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.612901" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.613135" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:57:08.613226" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:08.605628" elapsed="0.007845">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.613705" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.613937" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.614189" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.614450" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.614721" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:57:08.604689" elapsed="0.010180">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:57:08.614982" level="FAIL">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>Check Flow Stats Are Not Frozen</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.299963" elapsed="30.315143">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check that duration flow stat is increasing.</doc>
<status status="FAIL" start="2026-04-11T00:56:38.288041" elapsed="30.327276">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t22" name="Check Flows After Owner Reconnect In Operational DS" line="165">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:57:08.618958" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:57:08.618696" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:08.620285" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:08.620160" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:08.620137" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:08.625243" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:08.625137" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:08.625118" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:57:08.626314" 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-11T00:57:08.625930" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:57:08.626808" 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-11T00:57:08.626521" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:57:08.626879" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:57:08.627033" 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-11T00:57:08.625557" elapsed="0.001501"/>
</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-11T00:57:08.627434" 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-11T00:57:08.627681" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:57:08.627533" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:57:08.627516" elapsed="0.000241"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:57:08.627274" elapsed="0.000506"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:57:08.627114" elapsed="0.000693"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:57:08.624777" elapsed="0.003084"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:57:08.619845" elapsed="0.008071"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:57:08.619400" elapsed="0.008560"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:57:08.616340" elapsed="0.011683"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:08.629975" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:08.629677" elapsed="0.000365"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:08.630091" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:57:08.630242" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:08.629119" elapsed="0.001148"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:08.630674" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:08.630437" elapsed="0.000544">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.631180" elapsed="0.000021"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.631373" elapsed="0.000036"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:08.631588" elapsed="0.000020"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:08.628745" elapsed="0.002953">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:09.635521" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:09.634698" elapsed="0.000899"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:09.635723" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T00:57:09.636349" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:09.633804" elapsed="0.002653"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:09.637519" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:09.636874" elapsed="0.001462">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:09.638873" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:09.639335" elapsed="0.000079"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:09.639848" elapsed="0.000048"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:09.632700" elapsed="0.007419">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:10.643825" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:10.643045" elapsed="0.000850"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:10.644009" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T00:57:10.644361" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:10.642169" elapsed="0.002302"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:10.645457" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:10.644834" elapsed="0.001235">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:10.646361" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:10.646652" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:10.646929" elapsed="0.000028"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:10.641107" elapsed="0.005981">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:11.650858" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:11.650077" elapsed="0.000852"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:11.651045" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:57:11.651429" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:11.649131" elapsed="0.002359"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:11.652989" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:11.651842" elapsed="0.002077">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:11.654415" elapsed="0.000055"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:11.654857" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:11.655296" elapsed="0.000046"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:11.648021" elapsed="0.007564">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:12.659326" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:12.658561" elapsed="0.000864"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:12.659550" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:57:12.659916" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:12.657667" elapsed="0.002306"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:12.660996" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:12.660414" elapsed="0.001431">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:12.662346" elapsed="0.000084"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:12.662823" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:12.663303" elapsed="0.000050"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:12.656592" elapsed="0.007017">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:13.667261" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:13.666489" elapsed="0.000841"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:13.667480" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:57:13.667841" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:13.665662" elapsed="0.002234"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:13.668823" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:13.668248" elapsed="0.001366">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:13.670076" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:13.670538" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:13.671010" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:13.664604" elapsed="0.006661">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:14.675236" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:14.674339" elapsed="0.000976"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:14.675501" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T00:57:14.675880" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:14.673367" elapsed="0.002572"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:14.676972" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:14.676308" elapsed="0.001472">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:14.678248" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:14.678851" elapsed="0.000056"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:14.679372" elapsed="0.000080"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:14.672240" elapsed="0.007580">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:15.683022" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:15.682529" elapsed="0.000540"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:15.683149" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T00:57:15.683399" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:15.681983" elapsed="0.001455"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:15.684045" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:15.683696" elapsed="0.000870">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:15.684858" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:15.685124" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:15.685418" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:15.680722" elapsed="0.004856">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:16.688960" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:16.688143" elapsed="0.000882"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:16.689135" elapsed="0.000073"/>
</return>
<msg time="2026-04-11T00:57:16.689516" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:16.687319" elapsed="0.002254"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:16.690487" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:16.689924" elapsed="0.001294">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:16.691706" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:16.692130" elapsed="0.000062"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:16.692613" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:16.686348" elapsed="0.006519">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:17.695572" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:17.695065" elapsed="0.000554"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:17.695699" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:57:17.695930" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:17.694557" elapsed="0.001413"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:17.696559" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:17.696191" elapsed="0.000907">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:17.697413" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:17.697683" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:17.697956" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:17.693786" elapsed="0.004328">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:18.700203" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:18.699737" elapsed="0.000506"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:18.700435" elapsed="0.000052"/>
</return>
<msg time="2026-04-11T00:57:18.700666" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:18.699224" elapsed="0.001477"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:18.701695" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:18.700919" elapsed="0.001278">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:18.702506" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:18.702778" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:18.703056" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:18.698635" elapsed="0.004578">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:19.706961" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:19.706164" elapsed="0.000868"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:19.707155" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:57:19.707667" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:19.705243" elapsed="0.002487"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:19.708686" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:19.708092" elapsed="0.001397">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:19.710056" elapsed="0.000036"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:19.710336" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:19.710635" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:19.704170" elapsed="0.006631">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:20.714266" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:20.713515" elapsed="0.000819"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:20.714479" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:57:20.714831" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:20.712697" elapsed="0.002189"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:20.715803" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:20.715233" elapsed="0.001368">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:20.717055" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:20.717507" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:20.717945" elapsed="0.000044"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:20.711691" elapsed="0.006502">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:21.721915" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:21.721115" elapsed="0.000870"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:21.722103" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:57:21.722487" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:21.720287" elapsed="0.002257"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:21.723322" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:21.722939" elapsed="0.000917">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:21.724255" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:21.724547" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:21.724823" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:21.719213" elapsed="0.005770">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:22.729990" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:22.729085" elapsed="0.000975"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:22.730184" elapsed="0.000273"/>
</return>
<msg time="2026-04-11T00:57:22.730750" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:22.728168" elapsed="0.002640"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:22.731845" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:22.731178" elapsed="0.001281">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:22.732761" elapsed="0.000033"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:22.733049" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:22.733327" elapsed="0.000028"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:22.726983" elapsed="0.006533">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:23.737968" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:23.736889" elapsed="0.001159"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:23.738178" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T00:57:23.738601" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:23.735906" elapsed="0.002752"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:23.739634" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:23.739019" elapsed="0.001602">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:23.741083" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:23.741537" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:23.741970" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:23.734550" elapsed="0.007678">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:24.746231" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:24.745468" elapsed="0.000854"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:24.746505" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T00:57:24.746869" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:24.744621" elapsed="0.002304"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:24.747870" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:24.747274" elapsed="0.001421">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:24.749159" elapsed="0.000048"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:24.749611" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:24.750043" elapsed="0.000044"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:24.743278" elapsed="0.007014">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:25.754767" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:25.753983" elapsed="0.000856"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:25.754956" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:57:25.755314" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:25.752521" elapsed="0.002850"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:25.756302" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:25.755761" elapsed="0.001345">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:25.757599" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:25.758028" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:25.758497" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:25.751462" elapsed="0.007287">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:26.762752" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:26.761844" elapsed="0.000991"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:26.762956" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:57:26.763337" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:26.760916" elapsed="0.002540"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:26.764447" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:26.763848" elapsed="0.001402">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:26.765787" elapsed="0.000063"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:26.766241" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:26.766718" elapsed="0.000048"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:26.759795" elapsed="0.007199">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:27.770966" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:27.770136" elapsed="0.000903"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:27.771162" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:57:27.771579" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:27.769206" elapsed="0.002433"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:27.772655" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:27.772009" elapsed="0.001516">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:27.774072" elapsed="0.000055"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:27.774547" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:27.774986" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:27.768052" elapsed="0.007189">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:28.777994" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:28.777465" elapsed="0.000575"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:28.778119" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T00:57:28.778414" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:28.776886" elapsed="0.001570"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:28.779564" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:28.778824" elapsed="0.001278">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:28.780552" elapsed="0.000055"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:28.781005" elapsed="0.000050"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:28.781491" elapsed="0.000048"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:28.776025" elapsed="0.005753">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:29.785449" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:29.784668" elapsed="0.000850"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:29.785634" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:57:29.785987" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:29.783830" elapsed="0.002213"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:29.787011" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:29.786421" elapsed="0.001183">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:29.787898" elapsed="0.000030"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:29.788164" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:29.788461" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:29.782739" elapsed="0.005889">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:30.792234" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:30.791483" elapsed="0.000820"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:30.792455" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:57:30.792816" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:30.790616" elapsed="0.002256"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:30.793803" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:30.793224" elapsed="0.001375">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:30.795055" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:30.795535" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:30.795977" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:30.789582" elapsed="0.006647">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:31.800086" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:31.799203" elapsed="0.000955"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:31.800273" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:57:31.800677" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:31.798320" elapsed="0.002415"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:31.801703" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:31.801112" elapsed="0.001422">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:31.803010" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:31.803473" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:31.804107" elapsed="0.000055"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:31.797232" elapsed="0.007145">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:32.808686" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:32.807859" elapsed="0.000896"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:32.808869" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:57:32.809223" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:32.807025" elapsed="0.002254"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:32.809875" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:32.809533" elapsed="0.000838">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:32.810685" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:32.810948" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:32.811215" elapsed="0.000028"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:32.805364" elapsed="0.006008">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:33.815014" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:33.814241" elapsed="0.000840"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:33.815196" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T00:57:33.815585" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:33.813411" elapsed="0.002231"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:33.816557" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:33.815988" elapsed="0.001369">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:33.817669" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:33.817935" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:33.818207" elapsed="0.000028"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:33.812286" elapsed="0.006078">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:34.822117" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:34.821256" elapsed="0.000930"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:34.822302" elapsed="0.000112"/>
</return>
<msg time="2026-04-11T00:57:34.822694" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:34.820369" elapsed="0.002380"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:34.823686" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:34.823097" elapsed="0.001396">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:34.824965" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:34.825428" elapsed="0.000075"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:34.825900" elapsed="0.000046"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:34.819283" elapsed="0.006871">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:35.830748" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:35.829504" elapsed="0.001390"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:35.830978" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T00:57:35.831214" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:35.828640" elapsed="0.002611"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:35.831865" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:35.831509" elapsed="0.000870">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:35.832709" elapsed="0.000038"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:35.833022" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:35.833299" elapsed="0.000030"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:35.827470" elapsed="0.006037">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:36.837174" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:36.836435" elapsed="0.000806"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:36.837356" elapsed="0.000121"/>
</return>
<msg time="2026-04-11T00:57:36.837755" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:36.835609" elapsed="0.002203"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:36.838786" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:36.838161" elapsed="0.001347">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:36.839802" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:36.840065" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:36.840337" elapsed="0.000027"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:36.834476" elapsed="0.006040">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:37.842468" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:37.842085" elapsed="0.000417"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:37.842562" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:57:37.842732" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:37.841715" elapsed="0.001042"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:37.843197" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:37.842917" elapsed="0.000692">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:37.843821" elapsed="0.000023"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:37.844014" elapsed="0.000021"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:37.844209" elapsed="0.000020"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:37.841114" elapsed="0.003209">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:38.848594" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:38.847724" elapsed="0.000941"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:38.848789" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T00:57:38.849186" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:38.846732" elapsed="0.002516"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:38.850227" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:38.849665" elapsed="0.002024">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:38.852274" elapsed="0.000055"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:38.852894" elapsed="0.000050"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:38.853342" elapsed="0.000077"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:38.845475" elapsed="0.008163">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:57:38.853833" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Flows On Member</arg>
<arg>${all_flows}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:57:08.628187" elapsed="30.225853">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Flows in Operational DS.</doc>
<status status="FAIL" start="2026-04-11T00:57:08.615629" elapsed="30.238746">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t23" name="Check Groups After Owner Reconnect In Operational DS" line="169">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:57:38.859021" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:57:38.858753" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:38.860448" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:38.860263" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:38.860240" elapsed="0.000290"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:38.865377" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:38.865268" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:38.865249" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:57:38.866516" 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-11T00:57:38.866097" elapsed="0.000446"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:57:38.867000" 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-11T00:57:38.866711" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:57:38.867071" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:57:38.867227" 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-11T00:57:38.865716" elapsed="0.001537"/>
</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-11T00:57:38.867680" 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-11T00:57:38.867931" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:57:38.867782" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:57:38.867765" elapsed="0.000243"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:57:38.867494" elapsed="0.000537"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:57:38.867313" elapsed="0.000745"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:57:38.864907" elapsed="0.003207"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:57:38.859964" elapsed="0.008205"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:57:38.859475" elapsed="0.008739"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:57:38.856563" elapsed="0.011715"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:38.870106" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:38.869809" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:38.870180" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:57:38.870370" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:38.869462" elapsed="0.000953"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:38.870812" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:38.870577" elapsed="0.000542">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:38.871317" elapsed="0.000022"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:38.871524" elapsed="0.000036"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:38.871738" elapsed="0.000022"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:38.869057" elapsed="0.002797">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:39.876355" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:39.875482" elapsed="0.000971"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:39.876533" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:57:39.876764" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:39.874588" elapsed="0.002212"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:39.877367" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:39.877023" elapsed="0.000863">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:39.878179" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:39.878467" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:39.878741" elapsed="0.000029"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:39.873490" elapsed="0.005411">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:40.882540" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:40.881760" elapsed="0.000848"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:40.882722" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:57:40.883079" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:40.880929" elapsed="0.002206"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:40.884058" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:40.883517" elapsed="0.001332">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:40.885303" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:40.885761" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:40.886197" elapsed="0.000045"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:40.879851" elapsed="0.006621">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:41.890283" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:41.889508" elapsed="0.000845"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:41.890512" elapsed="0.000090"/>
</return>
<msg time="2026-04-11T00:57:41.890879" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:41.888647" elapsed="0.002286"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:41.891893" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:41.891281" elapsed="0.001542">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:41.893518" elapsed="0.000054"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:41.893951" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:41.894411" elapsed="0.000048"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:41.887483" elapsed="0.007141">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:42.899265" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:42.898797" elapsed="0.000512"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:42.899404" elapsed="0.000059"/>
</return>
<msg time="2026-04-11T00:57:42.899653" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:42.896112" elapsed="0.003578"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:42.900239" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:42.899910" elapsed="0.000866">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:42.901066" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:42.901330" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:42.901630" elapsed="0.000029"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:42.895317" elapsed="0.006472">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:43.905629" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:43.904831" elapsed="0.000874"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:43.905896" elapsed="0.000088"/>
</return>
<msg time="2026-04-11T00:57:43.906281" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:43.903962" elapsed="0.002377"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:43.907049" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:43.906679" elapsed="0.000904">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:43.907895" elapsed="0.000034"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:43.908171" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:43.908468" elapsed="0.000030"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:43.902833" elapsed="0.005799">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:44.912325" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:44.911505" elapsed="0.000917"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:44.912549" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:57:44.912909" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:44.910665" elapsed="0.002302"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:44.913896" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:44.913317" elapsed="0.001377">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:44.915155" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:44.915613" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:44.916076" elapsed="0.000050"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:44.909587" elapsed="0.006749">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:45.920086" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:45.919309" elapsed="0.000843"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:45.920268" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:57:45.920654" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:45.918516" elapsed="0.002192"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:45.922143" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:45.921056" elapsed="0.001863">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:45.923422" elapsed="0.000057"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:45.923864" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:45.924308" elapsed="0.000045"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:45.917431" elapsed="0.007159">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:46.928628" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:46.927728" elapsed="0.000955"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:46.928763" elapsed="0.000061"/>
</return>
<msg time="2026-04-11T00:57:46.928999" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:46.926894" elapsed="0.002140"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:46.929636" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:46.929254" elapsed="0.000901">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:46.930471" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:46.930743" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:46.931015" elapsed="0.000028"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:46.925756" elapsed="0.005416">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:47.933222" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:47.932830" elapsed="0.000428"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:47.933324" elapsed="0.000047"/>
</return>
<msg time="2026-04-11T00:57:47.933520" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:47.932444" elapsed="0.001101"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:47.933986" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:47.933724" elapsed="0.000660">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:47.934618" elapsed="0.000022"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:47.934809" elapsed="0.000021"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:47.935003" elapsed="0.000020"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:47.931824" elapsed="0.003297">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:48.938961" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:57:48.938131" elapsed="0.000905"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:57:48.939162" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T00:57:48.939612" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:57:48.937236" elapsed="0.002441"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:57:48.940775" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:57:48.940188" elapsed="0.001374">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:48.942020" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:48.942475" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:48.942924" elapsed="0.000046"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:57:48.936094" elapsed="0.007086">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:57:48.943369" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Groups On Member</arg>
<arg>${all_groups}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:57:38.868470" elapsed="10.075175">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Groups in Operational DS.</doc>
<status status="FAIL" start="2026-04-11T00:57:38.855237" elapsed="10.088638">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t24" name="Check Flows After Owner Reconnect In Switch" line="177">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:57:48.949859" elapsed="0.000297"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:57:48.949483" elapsed="0.000750"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:48.951772" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:48.951632" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:48.951600" elapsed="0.000243"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:48.956655" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:48.956547" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:48.956529" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:57:48.957730" 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-11T00:57:48.957329" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:57:48.958205" 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-11T00:57:48.957919" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:57:48.958274" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:57:48.958445" 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-11T00:57:48.956952" elapsed="0.001518"/>
</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-11T00:57:48.958832" 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-11T00:57:48.959074" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:57:48.958927" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:57:48.958911" elapsed="0.000239"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:57:48.958686" elapsed="0.000487"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:57:48.958527" elapsed="0.000674"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:57:48.956171" elapsed="0.003083"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:57:48.951108" elapsed="0.008201"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:57:48.950489" elapsed="0.008863"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:57:48.945456" elapsed="0.013963"/>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<msg time="2026-04-11T00:57:48.963702" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<arg>${all_flows}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-11T00:57:48.959708" elapsed="0.004033">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Check Flows in switch.</doc>
<status status="FAIL" start="2026-04-11T00:57:48.944621" elapsed="0.019299">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s4-t25" name="Check Switches Generate Slave Connection" line="181">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:57:48.967530" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:57:48.967192" elapsed="0.000624"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:48.968876" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:48.968766" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:48.968747" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:48.973731" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:48.973620" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:48.973601" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:57:48.974807" 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-11T00:57:48.974428" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:57:48.975276" 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-11T00:57:48.974994" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:57:48.975345" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:57:48.975541" 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-11T00:57:48.974024" elapsed="0.001543"/>
</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-11T00:57:48.975910" 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-11T00:57:48.976151" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:57:48.976006" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:57:48.975989" elapsed="0.000238"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:57:48.975766" elapsed="0.000485"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:57:48.975618" elapsed="0.000657"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:57:48.973251" elapsed="0.003076"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:57:48.968478" elapsed="0.007917"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:57:48.968029" elapsed="0.008413"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:57:48.964758" elapsed="0.011735"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:57:48.980727" level="FAIL">Variable '${original_owner}' not found.</msg>
<var>${original_master}</var>
<arg>${ODL_SYSTEM_${original_owner}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="FAIL" start="2026-04-11T00:57:48.976650" elapsed="0.004115">Variable '${original_owner}' not found.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>50s</arg>
<arg>1s</arg>
<arg>OvsManager.Should Be Slave</arg>
<arg>s${switch}</arg>
<arg>${original_master}</arg>
<arg>update_data=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:48.981023" elapsed="0.000020"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:57:48.980880" elapsed="0.000210"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:57:48.980827" elapsed="0.000289"/>
</for>
<doc>Check switches are connected to new Slave.</doc>
<status status="FAIL" start="2026-04-11T00:57:48.964197" elapsed="0.017042">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s4-t26" name="Disconnect Mininet From Successor" line="194">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:57:48.984523" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:57:48.984244" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:48.985766" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:48.985657" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:48.985638" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:48.990618" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:48.990511" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:48.990492" elapsed="0.000237"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:57:48.991753" 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-11T00:57:48.991334" elapsed="0.000446"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:57:48.992230" 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-11T00:57:48.991943" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:57:48.992300" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:57:48.992472" 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-11T00:57:48.990957" elapsed="0.001540"/>
</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-11T00:57:48.992838" 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-11T00:57:48.993081" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:57:48.992935" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:57:48.992918" elapsed="0.000239"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:57:48.992694" elapsed="0.000486"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:57:48.992548" elapsed="0.000656"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:57:48.990137" elapsed="0.003119"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:57:48.985356" elapsed="0.007953"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:57:48.984937" elapsed="0.008416"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:57:48.981931" elapsed="0.011490"/>
</kw>
<kw name="Disconnect Cluster Mininet" owner="MininetKeywords">
<msg time="2026-04-11T00:57:48.998401" level="FAIL">Variable '${new_successor_list}' not found.</msg>
<arg>break</arg>
<arg>${new_successor_list}</arg>
<doc>Break and restore controller to mininet connection via iptables.</doc>
<status status="FAIL" start="2026-04-11T00:57:48.993683" elapsed="0.004773">Variable '${new_successor_list}' not found.</status>
</kw>
<doc>Disconnect mininet from the Successor.</doc>
<status status="FAIL" start="2026-04-11T00:57:48.981489" elapsed="0.017137">Variable '${new_successor_list}' not found.</status>
</test>
<test id="s1-s4-t27" name="Check Entity Owner Status And Find New Owner and Successor After Disconnect" line="198">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:57:49.002619" elapsed="0.000223"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:57:49.002323" elapsed="0.000577"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:49.003946" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:49.003829" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:49.003807" elapsed="0.000210"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:49.008856" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:49.008750" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:49.008732" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:57:49.009916" 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-11T00:57:49.009540" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:57:49.010403" 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-11T00:57:49.010106" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:57:49.010474" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:57:49.010625" 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-11T00:57:49.009149" elapsed="0.001501"/>
</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-11T00:57:49.010995" 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-11T00:57:49.011237" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:57:49.011091" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:57:49.011074" elapsed="0.000285"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:57:49.010850" elapsed="0.000547"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:57:49.010700" elapsed="0.000724"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:57:49.008380" elapsed="0.003098"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:57:49.003524" elapsed="0.008021"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:57:49.003054" elapsed="0.008536"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:57:48.999481" elapsed="0.012160"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:57:49.023970" level="FAIL">Variable '${owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:57:49.019959" elapsed="0.004050">Variable '${owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:57:50.041966" level="FAIL">Variable '${owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:57:50.037523" elapsed="0.004495">Variable '${owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:57:51.060011" level="FAIL">Variable '${owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:57:51.055925" elapsed="0.004137">Variable '${owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:57:52.077007" level="FAIL">Variable '${owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:57:52.072738" elapsed="0.004327">Variable '${owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:57:53.094671" level="FAIL">Variable '${owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:57:53.090488" elapsed="0.004234">Variable '${owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:57:54.110726" level="FAIL">Variable '${owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:57:54.106155" elapsed="0.004621">Variable '${owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:57:55.128594" level="FAIL">Variable '${owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:57:55.124511" elapsed="0.004138">Variable '${owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:57:56.151252" level="FAIL">Variable '${owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:57:56.145654" elapsed="0.005651">Variable '${owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:57:57.168726" level="FAIL">Variable '${owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:57:57.164685" elapsed="0.004093">Variable '${owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:57:58.188161" level="FAIL">Variable '${owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:57:58.184121" elapsed="0.004093">Variable '${owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:57:59.206469" level="FAIL">Variable '${owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:57:59.202320" elapsed="0.004208">Variable '${owner_list}' not found.</status>
</kw>
<msg time="2026-04-11T00:57:59.206663" level="FAIL">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Variable '${owner_list}' not found.</msg>
<var>${current_owner}</var>
<var>${current_successor_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device</arg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:57:49.011809" elapsed="10.195017">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Variable '${owner_list}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${current_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:59.207233" elapsed="0.000030"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${current_successor_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:59.207456" elapsed="0.000024"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor for first switch s1.</doc>
<status status="FAIL" start="2026-04-11T00:57:48.998871" elapsed="10.208789">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Variable '${owner_list}' not found.</status>
</test>
<test id="s1-s4-t28" name="Disconnect Mininet From Current Owner" line="211">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:57:59.211069" elapsed="0.000271"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:57:59.210796" elapsed="0.000625"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:59.212580" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:59.212435" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:59.212407" elapsed="0.000251"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:59.217474" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:59.217346" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:59.217327" elapsed="0.000250"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:57:59.218636" 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-11T00:57:59.218218" elapsed="0.000446"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:57:59.219123" 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-11T00:57:59.218830" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:57:59.219194" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T00:57:59.219353" 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-11T00:57:59.217814" elapsed="0.001564"/>
</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-11T00:57:59.219773" 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-11T00:57:59.220017" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:57:59.219870" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:57:59.219853" elapsed="0.000239"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:57:59.219624" elapsed="0.000491"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:57:59.219458" elapsed="0.000684"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:57:59.216986" elapsed="0.003209"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:57:59.212097" elapsed="0.008151"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:57:59.211585" elapsed="0.008709"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:57:59.208571" elapsed="0.011775"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:57:59.224925" level="FAIL">Variable '${current_owner}' not found.</msg>
<var>${current_owner_list}</var>
<arg>${current_owner}</arg>
<doc>Returns a list containing given items.</doc>
<status status="FAIL" start="2026-04-11T00:57:59.220518" elapsed="0.004447">Variable '${current_owner}' not found.</status>
</kw>
<kw name="Disconnect Cluster Mininet" owner="MininetKeywords">
<arg>break</arg>
<arg>${current_owner_list}</arg>
<doc>Break and restore controller to mininet connection via iptables.</doc>
<status status="NOT RUN" start="2026-04-11T00:57:59.225249" elapsed="0.000026"/>
</kw>
<doc>Disconnect mininet from the owner</doc>
<status status="FAIL" start="2026-04-11T00:57:59.207926" elapsed="0.017503">Variable '${current_owner}' not found.</status>
</test>
<test id="s1-s4-t29" name="Check Entity Owner Status And Find Current Owner and Successor After Disconnect" line="216">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:57:59.228751" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:57:59.228481" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:59.230030" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:59.229919" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:59.229899" elapsed="0.000261"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:57:59.234979" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:57:59.234866" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T00:57:59.234847" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:57:59.236072" 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-11T00:57:59.235673" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:57:59.236568" 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-11T00:57:59.236261" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:57:59.236639" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:57:59.236794" 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-11T00:57:59.235277" elapsed="0.001542"/>
</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-11T00:57:59.237176" 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-11T00:57:59.237437" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:57:59.237274" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:57:59.237257" elapsed="0.000274"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:57:59.237029" elapsed="0.000531"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:57:59.236872" elapsed="0.000714"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:57:59.234490" elapsed="0.003150"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:57:59.229633" elapsed="0.008062"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:57:59.229175" elapsed="0.008563"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:57:59.226344" elapsed="0.011446"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:57:59.250447" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${original_owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:57:59.246303" elapsed="0.004190">Variable '${original_owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:58:00.267539" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${original_owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:58:00.263430" elapsed="0.004162">Variable '${original_owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:58:01.286935" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${original_owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:58:01.282795" elapsed="0.004199">Variable '${original_owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:58:02.304762" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${original_owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:58:02.300535" elapsed="0.004292">Variable '${original_owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:58:03.322037" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${original_owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:58:03.317954" elapsed="0.004133">Variable '${original_owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:58:04.343300" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${original_owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:58:04.337610" elapsed="0.005745">Variable '${original_owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:58:05.360793" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${original_owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:58:05.356697" elapsed="0.004148">Variable '${original_owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:58:06.379991" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${original_owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:58:06.375271" elapsed="0.004773">Variable '${original_owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:58:07.397969" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${original_owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:58:07.393671" elapsed="0.004351">Variable '${original_owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:58:08.414644" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${original_owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:58:08.410060" elapsed="0.004639">Variable '${original_owner_list}' not found.</status>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T00:58:09.434529" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${original_owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T00:58:09.430431" elapsed="0.004150">Variable '${original_owner_list}' not found.</status>
</kw>
<msg time="2026-04-11T00:58:09.434699" level="FAIL">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Variable '${original_owner_list}' not found.</msg>
<var>${current_new_owner}</var>
<var>${current_new_successor_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device</arg>
<arg>openflow:1</arg>
<arg>1</arg>
<arg>${original_owner_list}</arg>
<arg>after_stop=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:57:59.237963" elapsed="10.196889">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Variable '${original_owner_list}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${current_new_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.435082" elapsed="0.000023"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${current_new_successor_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.435262" elapsed="0.000051"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor for first switch s1.</doc>
<status status="FAIL" start="2026-04-11T00:57:59.225809" elapsed="10.209680">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Variable '${original_owner_list}' not found.</status>
</test>
<test id="s1-s4-t30" name="Check Switch Moves To Current Master" line="229">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:58:09.439578" elapsed="0.000266"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:58:09.439263" elapsed="0.000639"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:58:09.440989" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:58:09.440850" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-11T00:58:09.440825" elapsed="0.000241"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:58:09.446215" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:58:09.446104" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T00:58:09.446085" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:58:09.447361" 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-11T00:58:09.446939" elapsed="0.000465"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:58:09.447872" 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-11T00:58:09.447575" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:58:09.447944" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T00:58:09.448102" 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-11T00:58:09.446536" elapsed="0.001590"/>
</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-11T00:58:09.448516" 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-11T00:58:09.448773" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:09.448619" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:09.448599" elapsed="0.000252"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:58:09.448350" elapsed="0.000523"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:58:09.448186" elapsed="0.000785"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:58:09.445737" elapsed="0.003292"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:58:09.440541" elapsed="0.008544"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:58:09.440059" elapsed="0.009071"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:58:09.436750" elapsed="0.012432"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:09.453639" level="FAIL">Variable '${current_new_owner}' not found.</msg>
<var>${current_new_master}</var>
<arg>${ODL_SYSTEM_${current_new_owner}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="FAIL" start="2026-04-11T00:58:09.449349" elapsed="0.004331">Variable '${current_new_owner}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>OvsManager.Should Be Master</arg>
<arg>s1</arg>
<arg>${current_new_master}</arg>
<arg>update_data=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.453869" elapsed="0.000023"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${current_new_owner}</arg>
<arg>${original_owner}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.454057" elapsed="0.000022"/>
</kw>
<doc>Check switch s1 is connected to original Master.</doc>
<status status="FAIL" start="2026-04-11T00:58:09.436078" elapsed="0.018138">Variable '${current_new_owner}' not found.</status>
</test>
<test id="s1-s4-t31" name="Check Linear Topology After Owner Disconnect" line="241">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:58:09.457442" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:58:09.457159" elapsed="0.000554"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:58:09.458740" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:58:09.458622" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-11T00:58:09.458601" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:58:09.465058" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:58:09.464948" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T00:58:09.464928" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:58:09.466167" 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-11T00:58:09.465758" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:58:09.466668" 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-11T00:58:09.466361" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:58:09.466740" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:58:09.466895" 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-11T00:58:09.465358" elapsed="0.001568"/>
</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-11T00:58:09.467286" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.467583" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:09.467433" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:09.467414" elapsed="0.000247"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:58:09.467140" elapsed="0.000544"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:58:09.466981" elapsed="0.000729"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:58:09.464568" elapsed="0.003195"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:58:09.458311" elapsed="0.009508"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:58:09.457875" elapsed="0.009988"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:58:09.455008" elapsed="0.012909"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:09.469833" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:09.469535" elapsed="0.000376"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:09.469968" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T00:58:09.470122" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:09.469173" elapsed="0.000973"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:09.470568" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:09.470304" elapsed="0.000654">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.471189" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.471652" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.471843" elapsed="0.000019"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.472038" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.472225" elapsed="0.000019"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.472422" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.472611" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.472855" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:09.472695" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:09.472678" elapsed="0.000253"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.473150" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:09.472983" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:09.472967" elapsed="0.000262"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:09.473455" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:09.473281" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:09.473266" elapsed="0.000268"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:09.471491" elapsed="0.002065"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:09.471261" elapsed="0.002320"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:09.468787" elapsed="0.004892">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:10.477685" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:10.476898" elapsed="0.000856"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:10.477876" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:58:10.478231" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:10.476014" elapsed="0.002274"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:10.479230" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:10.478675" elapsed="0.001336">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:10.480570" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:10.482099" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:10.482582" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:10.483007" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:10.483455" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:10.483881" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:10.484494" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:10.485079" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:10.484707" elapsed="0.000502"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:10.484664" elapsed="0.000588"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:10.485490" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:10.485312" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:10.485296" elapsed="0.000274"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:10.485783" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:10.485623" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:10.485608" elapsed="0.000253"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:10.481737" elapsed="0.004146"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:10.480733" elapsed="0.005177"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:10.474967" elapsed="0.011042">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:11.489938" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:11.489140" elapsed="0.000867"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:11.490126" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:58:11.490516" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:11.488281" elapsed="0.002292"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:11.491491" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:11.490923" elapsed="0.001317">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:11.492736" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:11.493682" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:11.494107" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:11.494549" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:11.494965" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:11.495378" elapsed="0.000073"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:11.495828" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:11.496416" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:11.496027" elapsed="0.000512"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:11.495986" elapsed="0.000606"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:11.497107" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:11.496709" elapsed="0.000536"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:11.496675" elapsed="0.000630"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:11.497582" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:11.497420" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:11.497400" elapsed="0.000259"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:11.493314" elapsed="0.004367"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:11.492894" elapsed="0.004814"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:11.487257" elapsed="0.010549">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:12.501988" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:12.501142" elapsed="0.000916"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:12.502176" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:58:12.502575" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:12.500309" elapsed="0.002303"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:12.503182" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:12.502836" elapsed="0.000859">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:12.503990" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:12.504588" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:12.504858" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:12.505123" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:12.505379" elapsed="0.000064"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:12.505692" elapsed="0.000330"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:12.506269" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:12.506656" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:12.506423" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:12.506375" elapsed="0.000393"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:12.507068" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:12.506844" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:12.506823" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:12.507493" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:12.507249" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:12.507228" elapsed="0.000375"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:12.504349" elapsed="0.003287"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:12.504091" elapsed="0.003581"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:12.499277" elapsed="0.008527">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:13.512085" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:13.511175" elapsed="0.000980"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:13.512275" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T00:58:13.512672" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:13.510253" elapsed="0.002475"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:13.513661" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:13.513078" elapsed="0.001358">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:13.515019" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:13.515974" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:13.516430" elapsed="0.000055"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:13.516856" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:13.517265" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:13.517698" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:13.518106" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:13.518796" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:13.518299" elapsed="0.000766"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:13.518259" elapsed="0.000865"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:13.519436" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:13.519246" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:13.519211" elapsed="0.000303"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:13.519727" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:13.519566" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:13.519551" elapsed="0.000253"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:13.515625" elapsed="0.004203"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:13.515185" elapsed="0.004670"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:13.509188" elapsed="0.010766">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:14.524010" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:14.523177" elapsed="0.000902"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:14.524198" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:58:14.524473" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:14.522342" elapsed="0.002166"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:14.525075" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:14.524730" elapsed="0.000877">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:14.525903" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:14.526492" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:14.526761" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:14.527021" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:14.527299" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:14.527579" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:14.527843" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:14.528199" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:14.527970" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:14.527943" elapsed="0.000371"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:14.528924" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:14.528406" elapsed="0.000597"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:14.528367" elapsed="0.000670"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:14.529344" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:14.529112" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:14.529090" elapsed="0.000386"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:14.526251" elapsed="0.003258"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:14.526002" elapsed="0.003545"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:14.521287" elapsed="0.008394">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:15.533885" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:15.533058" elapsed="0.000902"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:15.534085" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:58:15.534496" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:15.532159" elapsed="0.002399"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:15.535693" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:15.534938" elapsed="0.001590">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:15.536990" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:15.537945" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:15.538369" elapsed="0.000082"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:15.538914" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:15.539336" elapsed="0.000073"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:15.539790" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:15.540290" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:15.540578" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:15.540412" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:15.540378" elapsed="0.000280"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:15.540873" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:15.540712" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:15.540697" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:15.541165" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:15.541004" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:15.540988" elapsed="0.000256"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:15.537597" elapsed="0.003671"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:15.537148" elapsed="0.004147"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:15.530997" elapsed="0.010409">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:16.546123" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:16.545251" elapsed="0.000948"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:16.546346" elapsed="0.000128"/>
</return>
<msg time="2026-04-11T00:58:16.546781" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:16.544204" elapsed="0.002638"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:16.548057" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:16.547334" elapsed="0.001717">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:16.549681" elapsed="0.000059"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:16.550701" elapsed="0.000054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:16.551163" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:16.551655" elapsed="0.000053"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:16.552116" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:16.552598" elapsed="0.000050"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:16.553073" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:16.553728" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:16.553291" elapsed="0.000570"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:16.553245" elapsed="0.000679"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:16.554628" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:16.554049" elapsed="0.000722"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:16.554013" elapsed="0.000820"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:16.555370" elapsed="0.000110"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:16.554967" elapsed="0.000600"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:16.554929" elapsed="0.000712"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:16.550289" elapsed="0.005430"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:16.549859" elapsed="0.005927"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:16.542983" elapsed="0.013036">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:17.560902" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:17.560103" elapsed="0.000867"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:17.561090" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:58:17.561551" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:17.559036" elapsed="0.002578"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:17.562489" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:17.561973" elapsed="0.001023">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:17.563290" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:17.563888" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:17.564157" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:17.564450" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:17.564722" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:17.564986" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:17.565246" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:17.565643" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:17.565371" elapsed="0.000349"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:17.565344" elapsed="0.000412"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:17.566064" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:17.565832" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:17.565810" elapsed="0.000365"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:17.566492" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:17.566248" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:17.566227" elapsed="0.000375"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:17.563665" elapsed="0.002969"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:17.563411" elapsed="0.003261"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:17.557990" elapsed="0.008815">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:18.570843" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:18.570035" elapsed="0.000879"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:18.571033" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:58:18.571414" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:18.569208" elapsed="0.002265"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:18.572366" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:18.571827" elapsed="0.001322">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:18.573771" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:18.574750" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:18.575180" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:18.575631" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:18.576050" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:18.576502" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:18.576926" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:18.577522" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:18.577122" elapsed="0.000525"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:18.577082" elapsed="0.000619"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:18.578225" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:18.577819" elapsed="0.000534"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:18.577785" elapsed="0.000623"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:18.578625" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:18.578463" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:18.578447" elapsed="0.000256"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:18.574373" elapsed="0.004353"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:18.573940" elapsed="0.004812"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:18.568132" elapsed="0.010717">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:19.583702" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:19.583003" elapsed="0.000747"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:19.583835" elapsed="0.000056"/>
</return>
<msg time="2026-04-11T00:58:19.584072" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:19.581925" elapsed="0.002182"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:19.584749" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:19.584333" elapsed="0.000942">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:19.585594" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:19.586170" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:19.586460" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:19.586720" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:19.587001" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:19.587264" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:19.587542" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:19.587899" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:19.587671" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:19.587643" elapsed="0.000366"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:19.588307" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:19.588083" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:19.588062" elapsed="0.000376"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:19.588981" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:19.588756" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:19.588733" elapsed="0.000356"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:19.585952" elapsed="0.003169"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:19.585698" elapsed="0.003458"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:19.580204" elapsed="0.009086">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:20.593503" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:20.592718" elapsed="0.000859"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:20.593697" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:58:20.594053" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:20.591865" elapsed="0.002246"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:20.595043" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:20.594494" elapsed="0.001373">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:20.596333" elapsed="0.000081"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:20.597278" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:20.597737" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:20.598156" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:20.598598" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:20.599016" elapsed="0.000044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:20.599583" elapsed="0.000086"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:20.600264" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:20.599887" elapsed="0.000524"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:20.599840" elapsed="0.000600"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:20.600653" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:20.600494" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:20.600478" elapsed="0.000250"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:20.600935" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:20.600779" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:20.600764" elapsed="0.000247"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:20.596930" elapsed="0.004103"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:20.596526" elapsed="0.004532"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:20.590665" elapsed="0.010492">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:21.605891" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:21.604539" elapsed="0.001423"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:21.606084" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:58:21.606499" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:21.603647" elapsed="0.002915"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:21.607766" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:21.607163" elapsed="0.001425">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:21.609048" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:21.609981" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:21.610566" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:21.610989" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:21.611431" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:21.611851" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:21.612311" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:21.612663" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:21.612496" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:21.612477" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:21.612954" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:21.612794" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:21.612779" elapsed="0.000251"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:21.613237" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:21.613080" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:21.613065" elapsed="0.000247"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:21.609633" elapsed="0.003701"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:21.609204" elapsed="0.004156"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:21.602503" elapsed="0.010968">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:22.617378" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:22.616602" elapsed="0.000873"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:22.617596" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:58:22.617948" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:22.615778" elapsed="0.002225"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:22.618915" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:22.618350" elapsed="0.001344">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:22.620148" elapsed="0.000048"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:22.621091" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:22.621544" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:22.621960" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:22.622370" elapsed="0.000069"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:22.622810" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:22.623219" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:22.623801" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:22.623437" elapsed="0.000484"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:22.623370" elapsed="0.000604"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:22.624473" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:22.624089" elapsed="0.000510"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:22.624056" elapsed="0.000595"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:22.625169" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:22.624765" elapsed="0.000527"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:22.624732" elapsed="0.000750"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:22.620727" elapsed="0.004784"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:22.620301" elapsed="0.005249"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:22.614700" elapsed="0.010950">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:23.629723" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:23.628881" elapsed="0.000916"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:23.629916" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:58:23.630319" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:23.628006" elapsed="0.002372"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:23.631350" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:23.630666" elapsed="0.001203">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:23.632166" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:23.632851" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:23.633123" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:23.633406" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:23.633698" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:23.633960" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:23.634227" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:23.634611" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:23.634354" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:23.634327" elapsed="0.000400"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:23.635042" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:23.634810" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:23.634780" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:23.635472" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:23.635226" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:23.635204" elapsed="0.000382"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:23.632620" elapsed="0.002998"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:23.632275" elapsed="0.003381"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:23.626924" elapsed="0.008865">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:24.639920" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:24.639143" elapsed="0.000846"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:24.640108" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:58:24.640496" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:24.638300" elapsed="0.002254"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:24.641472" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:24.640902" elapsed="0.002781">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:24.644152" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:24.645088" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:24.645573" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:24.646181" elapsed="0.000188"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:24.646691" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:24.646952" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:24.647209" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:24.647593" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:24.647335" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:24.647309" elapsed="0.000398"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:24.648003" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:24.647781" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:24.647759" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:24.648428" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:24.648187" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:24.648165" elapsed="0.000376"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:24.644738" elapsed="0.003835"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:24.644309" elapsed="0.004300"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:24.637122" elapsed="0.011621">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:25.652730" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:25.651947" elapsed="0.000855"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:25.652956" elapsed="0.000097"/>
</return>
<msg time="2026-04-11T00:58:25.653340" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:25.651083" elapsed="0.002347"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:25.654342" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:25.653786" elapsed="0.001878">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:25.656132" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:25.657079" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:25.657541" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:25.657960" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:25.658372" elapsed="0.000073"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:25.658871" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:25.659292" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:25.659785" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:25.659530" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:25.659482" elapsed="0.000382"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:25.660078" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:25.659917" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:25.659902" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:25.660370" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:25.660208" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:25.660193" elapsed="0.000268"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:25.656727" elapsed="0.003757"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:25.656292" elapsed="0.004218"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:25.650014" elapsed="0.010592">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:26.664053" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:26.663420" elapsed="0.000692"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:26.664211" elapsed="0.000070"/>
</return>
<msg time="2026-04-11T00:58:26.664528" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:26.662712" elapsed="0.001859"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:26.665292" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:26.664858" elapsed="0.001111">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:26.666411" elapsed="0.000042"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:26.667149" elapsed="0.000039"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:26.667557" elapsed="0.000041"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:26.667909" elapsed="0.000037"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:26.668245" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:26.668587" elapsed="0.000038"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:26.668926" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:26.669421" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:26.669089" elapsed="0.000435"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:26.669056" elapsed="0.000514"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:26.669973" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:26.669677" elapsed="0.000392"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:26.669648" elapsed="0.000463"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:26.670522" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:26.670208" elapsed="0.000410"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:26.670181" elapsed="0.000478"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:26.666862" elapsed="0.003839"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:26.666541" elapsed="0.004206"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:26.661813" elapsed="0.009097">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:27.674861" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:27.674083" elapsed="0.000849"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:27.675049" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:58:27.675432" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:27.673251" elapsed="0.002240"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:27.676466" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:27.675845" elapsed="0.001162">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:27.677301" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:27.678201" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:27.678487" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:27.678748" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:27.679005" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:27.679346" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:27.679629" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:27.679995" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:27.679755" elapsed="0.000319"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:27.679728" elapsed="0.000380"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:27.680425" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:27.680182" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:27.680160" elapsed="0.000376"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:27.680837" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:27.680611" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:27.680588" elapsed="0.000357"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:27.677977" elapsed="0.003001"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:27.677421" elapsed="0.003592"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:27.672200" elapsed="0.008944">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:28.685170" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:28.684366" elapsed="0.000873"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:28.685356" elapsed="0.000111"/>
</return>
<msg time="2026-04-11T00:58:28.685780" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:28.683564" elapsed="0.002278"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:28.686765" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:28.686190" elapsed="0.001388">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:28.688034" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:28.689034" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:28.689491" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:28.689763" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:28.689947" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:28.690134" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:28.690325" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:28.690594" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:28.690430" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:28.690410" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:28.690885" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:28.690727" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:28.690711" elapsed="0.000251"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:28.691171" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:28.691014" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:28.690998" elapsed="0.000250"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:28.688686" elapsed="0.002585"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:28.688214" elapsed="0.003083"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:28.682411" elapsed="0.008994">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:29.695816" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:29.694940" elapsed="0.001086"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:29.696160" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T00:58:29.696605" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:29.694004" elapsed="0.002668"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:29.697744" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:29.697063" elapsed="0.001559">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:29.699119" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:29.700668" elapsed="0.000053"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:29.701134" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:29.701638" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:29.701824" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:29.702006" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:29.702189" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:29.702461" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:29.702281" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:29.702262" elapsed="0.000280"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:29.702753" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:29.702595" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:29.702580" elapsed="0.000248"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:29.703037" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:29.702880" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:29.702863" elapsed="0.000249"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:29.700247" elapsed="0.002887"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:29.699290" elapsed="0.003872"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:29.692774" elapsed="0.010488">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:30.707161" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:30.706428" elapsed="0.000804"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:30.707348" elapsed="0.000109"/>
</return>
<msg time="2026-04-11T00:58:30.707736" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:30.705572" elapsed="0.002221"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:30.708707" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:30.708138" elapsed="0.001340">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:30.709960" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:30.710912" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:30.711330" elapsed="0.000043"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:30.711786" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:30.712190" elapsed="0.000043"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:30.712621" elapsed="0.000044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:30.713151" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:30.713743" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:30.713347" elapsed="0.000562"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:30.713307" elapsed="0.000661"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:30.714471" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:30.714086" elapsed="0.000506"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:30.714051" elapsed="0.000593"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:30.714893" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:30.714731" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:30.714713" elapsed="0.000258"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:30.710541" elapsed="0.004454"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:30.710114" elapsed="0.004907"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:30.704548" elapsed="0.010571">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:31.718935" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:31.718148" elapsed="0.000854"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:31.719114" elapsed="0.000075"/>
</return>
<msg time="2026-04-11T00:58:31.719484" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:31.717340" elapsed="0.002201"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:31.720453" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:31.719887" elapsed="0.001303">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:31.721677" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:31.722717" elapsed="0.000041"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:31.723017" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:31.723587" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:31.723872" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:31.724145" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:31.724436" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:31.724811" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:31.724572" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:31.724544" elapsed="0.000382"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:31.725237" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:31.725003" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:31.724980" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:31.725683" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:31.725448" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:31.725424" elapsed="0.000374"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:31.722220" elapsed="0.003612"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:31.721832" elapsed="0.004038"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:31.716338" elapsed="0.009670">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:32.729490" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:32.728665" elapsed="0.000901"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:32.729692" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T00:58:32.730203" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:32.727776" elapsed="0.002489"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:32.731329" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:32.730683" elapsed="0.001303">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:32.732285" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:32.732884" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:32.733150" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:32.733430" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:32.733688" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:32.733951" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:32.734213" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:32.734588" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:32.734338" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:32.734312" elapsed="0.000388"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:32.735014" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:32.734774" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:32.734752" elapsed="0.000375"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:32.735443" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:32.735199" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:32.735177" elapsed="0.000375"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:32.732664" elapsed="0.002920"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:32.732405" elapsed="0.003215"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:32.726953" elapsed="0.008805">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:33.739802" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:33.738996" elapsed="0.000878"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:33.740032" elapsed="0.000089"/>
</return>
<msg time="2026-04-11T00:58:33.740442" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:33.738164" elapsed="0.002338"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:33.741466" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:33.740885" elapsed="0.001345">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:33.742755" elapsed="0.000067"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:33.743793" elapsed="0.000070"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:33.744308" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:33.744761" elapsed="0.002418"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:33.747453" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:33.747742" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:33.748009" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:33.748366" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:33.748135" elapsed="0.000407"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:33.748109" elapsed="0.000469"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:33.748924" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:33.748654" elapsed="0.000347"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:33.748632" elapsed="0.000402"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:33.749329" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:33.749107" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:33.749085" elapsed="0.000374"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:33.743338" elapsed="0.006154"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:33.742939" elapsed="0.006588"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:33.737075" elapsed="0.012587">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:34.753605" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:34.752831" elapsed="0.000843"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:34.753788" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:58:34.754135" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:34.751926" elapsed="0.002264"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:34.755119" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:34.754564" elapsed="0.001324">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:34.756362" elapsed="0.000076"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:34.757281" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:34.757731" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:34.758142" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:34.758578" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:34.758989" elapsed="0.000044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:34.759427" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:34.759985" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:34.759621" elapsed="0.000484"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:34.759581" elapsed="0.000579"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:34.760714" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:34.760326" elapsed="0.000494"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:34.760292" elapsed="0.000555"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:34.761058" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:34.760898" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:34.760883" elapsed="0.000254"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:34.756943" elapsed="0.004216"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:34.756548" elapsed="0.004638"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:34.750920" elapsed="0.010363">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:35.766176" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:35.765259" elapsed="0.000982"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:35.766351" elapsed="0.000102"/>
</return>
<msg time="2026-04-11T00:58:35.766697" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:35.764066" elapsed="0.002680"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:35.767684" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:35.767061" elapsed="0.001372">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:35.768917" elapsed="0.000045"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:35.769753" elapsed="0.000043"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:35.770142" elapsed="0.000042"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:35.770554" elapsed="0.000041"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:35.770940" elapsed="0.000040"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:35.771320" elapsed="0.000041"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:35.771709" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:35.772123" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:35.771870" elapsed="0.000353"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:35.771836" elapsed="0.000441"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:35.772719" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:35.772379" elapsed="0.000470"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:35.772353" elapsed="0.000540"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:35.773328" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:35.773005" elapsed="0.000457"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:35.772972" elapsed="0.000527"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:35.769438" elapsed="0.004108"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:35.769061" elapsed="0.004541"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:35.762720" elapsed="0.011065">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:36.776572" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:36.776143" elapsed="0.000470"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:36.776680" elapsed="0.000047"/>
</return>
<msg time="2026-04-11T00:58:36.776871" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:36.775715" elapsed="0.001185"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:36.777425" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:36.777089" elapsed="0.000804">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:36.778153" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:36.778683" elapsed="0.000025"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:36.778916" elapsed="0.000023"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:36.779138" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:36.779358" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:36.779598" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:36.779818" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:36.780126" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:36.779923" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:36.779899" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:36.780585" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:36.780297" elapsed="0.000354"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:36.780279" elapsed="0.000401"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:36.780946" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:36.780742" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:36.780724" elapsed="0.000319"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:36.778492" elapsed="0.002580"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:36.778235" elapsed="0.002870"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:36.775086" elapsed="0.006136">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:37.785171" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:37.784426" elapsed="0.000814"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:37.785358" elapsed="0.000109"/>
</return>
<msg time="2026-04-11T00:58:37.785747" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:37.783584" elapsed="0.002221"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:37.786792" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:37.786206" elapsed="0.001383">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:37.788051" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:37.788986" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:37.789442" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:37.789863" elapsed="0.000068"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:37.790305" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:37.790757" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:37.791284" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:37.791876" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:37.791511" elapsed="0.000483"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:37.791467" elapsed="0.000580"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:37.792548" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:37.792164" elapsed="0.000505"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:37.792131" elapsed="0.000590"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:37.793189" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:37.792834" elapsed="0.000473"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:37.792801" elapsed="0.000558"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:37.788637" elapsed="0.004813"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:37.788207" elapsed="0.005304"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:37.782545" elapsed="0.011179">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:38.796850" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:38.796343" elapsed="0.000554"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:38.796975" elapsed="0.000053"/>
</return>
<msg time="2026-04-11T00:58:38.797203" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:38.795448" elapsed="0.001792"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:38.797846" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:38.797494" elapsed="0.000845">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:38.798748" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:38.799346" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:38.799635" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:38.799894" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:38.800151" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:38.800430" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:38.800695" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:38.801059" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:38.800822" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:38.800796" elapsed="0.000374"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:38.801493" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:38.801244" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:38.801222" elapsed="0.000380"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:38.801901" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:38.801673" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:38.801652" elapsed="0.000356"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:38.799129" elapsed="0.002910"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:38.798866" elapsed="0.003210"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:38.794720" elapsed="0.007533">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:39.806364" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:39.805579" elapsed="0.000885"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:39.806588" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:58:39.806945" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:39.804718" elapsed="0.002283"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:39.807995" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:39.807374" elapsed="0.001476">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.809318" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.810267" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.810731" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.811172" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.811623" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.812051" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.812498" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.813070" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:39.812702" elapsed="0.000490"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:39.812660" elapsed="0.000588"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.813758" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:39.813366" elapsed="0.000517"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:39.813332" elapsed="0.000605"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.814572" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:39.814172" elapsed="0.000526"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:39.814135" elapsed="0.000617"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:58:39.809920" elapsed="0.004884"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:58:39.809520" elapsed="0.005340"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:39.803641" elapsed="0.011471">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:58:39.815309" level="FAIL">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Linear Topology On Member</arg>
<arg>${SWITCHES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:58:09.468087" elapsed="30.347458">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Linear Topology.</doc>
<status status="FAIL" start="2026-04-11T00:58:09.454520" elapsed="30.361362">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t32" name="Check Stats Are Not Frozen After Owner Disconnect" line="245">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:58:39.820489" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:58:39.820205" elapsed="0.000554"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:58:39.821785" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:58:39.821661" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-11T00:58:39.821642" elapsed="0.000211"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:58:39.826636" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:58:39.826529" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T00:58:39.826511" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:58:39.827736" 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-11T00:58:39.827340" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:58:39.828214" 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-11T00:58:39.827929" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:58:39.828285" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:58:39.828454" 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-11T00:58:39.826935" elapsed="0.001545"/>
</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-11T00:58:39.828824" 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-11T00:58:39.829067" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:58:39.828919" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:58:39.828903" elapsed="0.000240"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:58:39.828680" elapsed="0.000487"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:58:39.828531" elapsed="0.000660"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:58:39.826159" elapsed="0.003084"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:58:39.821357" elapsed="0.007940"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:58:39.820921" elapsed="0.008419"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:58:39.816938" elapsed="0.012469"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:39.831361" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:39.831066" elapsed="0.000335"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:39.831450" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:58:39.831598" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:39.830714" elapsed="0.000909"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:39.832103" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:39.831826" elapsed="0.000628">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.832654" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.832888" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.833066" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.833238" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.833424" elapsed="0.000021"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:39.833491" elapsed="0.000016"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:39.830360" elapsed="0.003234">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.833765" elapsed="0.000025"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.833962" elapsed="0.000022"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.834143" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.834316" elapsed="0.000225"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:39.834731" elapsed="0.000022"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:39.830036" elapsed="0.004806">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:40.837904" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:40.837416" elapsed="0.000536"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:40.838029" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T00:58:40.838257" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:40.836874" elapsed="0.001419"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:40.838939" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:40.838536" elapsed="0.000922">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:40.839790" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:40.840121" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:40.840368" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:40.840637" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:40.840874" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:40.840965" elapsed="0.000024"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:40.836284" elapsed="0.004831">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:40.841346" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:40.841603" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:40.841857" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:40.842100" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:40.842377" elapsed="0.000048"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:40.835497" elapsed="0.007148">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:41.847049" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:41.846236" elapsed="0.000888"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:41.847246" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:58:41.847727" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:41.845245" elapsed="0.002545"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:41.848897" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:41.848154" elapsed="0.001395">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:41.849859" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:41.850185" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:41.850460" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:41.850700" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:41.850932" elapsed="0.000027"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:41.851026" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:41.844409" elapsed="0.006770">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:41.851424" elapsed="0.000032"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:41.851662" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:41.851912" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:41.852158" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:41.852470" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:41.843380" elapsed="0.009243">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:42.857472" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:42.856896" elapsed="0.000625"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:42.857605" elapsed="0.000059"/>
</return>
<msg time="2026-04-11T00:58:42.857843" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:42.855927" elapsed="0.001951"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:42.858564" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:42.858114" elapsed="0.000981">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:42.859422" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:42.859756" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:42.860005" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:42.860244" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:42.860501" elapsed="0.000030"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:42.860595" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:42.854944" elapsed="0.005804">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:42.861126" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:42.861361" elapsed="0.000047"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:42.861634" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:42.861876" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:42.862147" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:42.854021" elapsed="0.008275">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:43.866572" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:43.866029" elapsed="0.000590"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:43.866701" elapsed="0.000059"/>
</return>
<msg time="2026-04-11T00:58:43.866938" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:43.865023" elapsed="0.001950"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:43.867624" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:43.867197" elapsed="0.000936">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:43.868450" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:43.868782" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:43.869033" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:43.869275" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:43.869558" elapsed="0.000030"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:43.869651" elapsed="0.000024"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:43.864151" elapsed="0.005651">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:43.870034" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:43.870267" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:43.870544" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:43.870790" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:43.871066" elapsed="0.000031"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:43.863078" elapsed="0.008143">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:44.875959" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:44.875173" elapsed="0.000856"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:44.876143" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:58:44.876532" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:44.874336" elapsed="0.002255"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:44.877596" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:44.876944" elapsed="0.001434">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:44.878871" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:44.879437" elapsed="0.000058"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:44.879976" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:44.880372" elapsed="0.000078"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:44.880793" elapsed="0.000046"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:44.880940" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:44.873497" elapsed="0.007682">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:44.881579" elapsed="0.000049"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:44.882003" elapsed="0.000049"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:44.882445" elapsed="0.000052"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:44.882840" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:44.883192" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:44.871938" elapsed="0.011364">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:45.887534" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:45.886749" elapsed="0.000854"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:45.887717" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:58:45.888071" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:45.885846" elapsed="0.002282"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:45.889133" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:45.888510" elapsed="0.001401">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:45.890432" elapsed="0.000052"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:45.890986" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:45.891381" elapsed="0.000078"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:45.891798" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:45.892175" elapsed="0.000045"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:45.892320" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:45.884921" elapsed="0.007663">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:45.892951" elapsed="0.000046"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:45.893321" elapsed="0.000044"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:45.893756" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:45.894140" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:45.894662" elapsed="0.000050"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:45.883976" elapsed="0.010933">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:46.899857" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:46.898920" elapsed="0.001010"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:46.900049" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:58:46.900376" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:46.898075" elapsed="0.002443"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:46.901149" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:46.900748" elapsed="0.000926">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:46.901974" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:46.902294" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:46.902562" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:46.902800" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:46.903071" elapsed="0.000030"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:46.903166" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:46.896656" elapsed="0.006658">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:46.903566" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:46.903799" elapsed="0.000027"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:46.904049" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:46.904289" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:46.904581" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:46.895732" elapsed="0.008999">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:47.909258" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:47.908340" elapsed="0.000989"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:47.909494" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:58:47.909858" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:47.907441" elapsed="0.002471"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:47.910922" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:47.910259" elapsed="0.001511">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:47.912368" elapsed="0.000121"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:47.913124" elapsed="0.000071"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:47.913690" elapsed="0.000066"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:47.914222" elapsed="0.000066"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:47.914754" elapsed="0.000049"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:47.914905" elapsed="0.000034"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:47.906413" elapsed="0.008765">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:47.915743" elapsed="0.000056"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:47.916138" elapsed="0.000045"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:47.916495" elapsed="0.000042"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:47.916828" elapsed="0.000040"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:47.917332" elapsed="0.000044"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:47.905476" elapsed="0.012107">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:48.922466" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:48.921671" elapsed="0.000872"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:48.922663" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:58:48.923021" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:48.920802" elapsed="0.002276"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:48.924138" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:48.923492" elapsed="0.001491">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:48.925511" elapsed="0.000054"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:48.926074" elapsed="0.000057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:48.926571" elapsed="0.000061"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:48.927034" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:48.927464" elapsed="0.000050"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:48.927617" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:48.919335" elapsed="0.008517">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:48.928295" elapsed="0.000055"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:48.928807" elapsed="0.000049"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:48.929216" elapsed="0.000053"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:48.929538" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:48.929737" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:48.918356" elapsed="0.011490">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:49.933927" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:49.933158" elapsed="0.000841"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:49.934116" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T00:58:49.934498" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:49.932298" elapsed="0.002258"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:49.935558" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:49.934905" elapsed="0.001399">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:49.936818" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:49.937336" elapsed="0.000080"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:49.937764" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:49.938144" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:49.938548" elapsed="0.000046"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:49.938695" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:49.931494" elapsed="0.007551">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:49.939453" elapsed="0.000050"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:49.939836" elapsed="0.000045"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:49.940240" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:49.940705" elapsed="0.000050"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:49.941156" elapsed="0.000044"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:49.930594" elapsed="0.010782">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:50.946140" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:50.945354" elapsed="0.000854"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:50.946328" elapsed="0.000109"/>
</return>
<msg time="2026-04-11T00:58:50.946721" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:50.943947" elapsed="0.002831"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:50.948167" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:50.947188" elapsed="0.001903">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:50.949650" elapsed="0.000053"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:50.950177" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:50.950552" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:50.950791" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:50.951028" elapsed="0.000027"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:50.951116" elapsed="0.000021"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:50.943095" elapsed="0.008170">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:50.951508" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:50.951742" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:50.951990" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:50.952289" elapsed="0.000039"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:50.952604" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:50.942121" elapsed="0.010635">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:51.956844" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:51.956065" elapsed="0.000846"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:51.957026" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T00:58:51.957375" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:51.955202" elapsed="0.002265"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:51.958498" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:51.957869" elapsed="0.001118">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:51.959281" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:51.959628" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:51.959983" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:51.960231" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:51.960494" elapsed="0.000034"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:51.960593" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:51.954357" elapsed="0.006386">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:51.960975" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:51.961209" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:51.961482" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:51.961725" elapsed="0.000040"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:51.962020" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:51.953477" elapsed="0.008694">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:52.966817" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:52.965521" elapsed="0.001365"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:52.967006" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:58:52.967361" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:52.964684" elapsed="0.002765"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:52.968074" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:52.967678" elapsed="0.000920">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:52.968890" elapsed="0.000030"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:52.969212" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:52.969493" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:52.969733" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:52.969969" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:52.970058" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:52.963835" elapsed="0.006369">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:52.970560" elapsed="0.000044"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:52.970873" elapsed="0.000037"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:52.971142" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:52.971406" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:52.971677" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:52.962925" elapsed="0.008903">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:53.975798" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:53.975044" elapsed="0.000823"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:53.975979" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:58:53.976485" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:53.974194" elapsed="0.002348"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:53.977540" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:53.976888" elapsed="0.001386">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:53.978759" elapsed="0.000074"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:53.979324" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:53.979756" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:53.980146" elapsed="0.000043"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:53.980549" elapsed="0.000046"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:53.980694" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:53.973368" elapsed="0.007558">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:53.981284" elapsed="0.000045"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:53.981682" elapsed="0.000045"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:53.982077" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:53.982485" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:53.982963" elapsed="0.000045"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:53.972527" elapsed="0.010678">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:54.987529" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:54.986703" elapsed="0.000897"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:54.987716" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:58:54.988068" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:54.985870" elapsed="0.002253"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:54.989797" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:54.988564" elapsed="0.002033">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:54.991068" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:54.991650" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:54.992096" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:54.992516" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:54.992893" elapsed="0.000043"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:54.993035" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:54.985020" elapsed="0.008246">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:54.993657" elapsed="0.000046"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:54.994028" elapsed="0.000044"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:54.994452" elapsed="0.000050"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:54.994839" elapsed="0.000154"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:54.995529" elapsed="0.000065"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:54.984067" elapsed="0.011755">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:56.000759" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:55.999761" elapsed="0.001070"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:56.000952" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:58:56.001315" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:55.998611" elapsed="0.002760"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:56.002419" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:56.001761" elapsed="0.001455">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:56.004009" elapsed="0.000062"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:56.004609" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:56.004857" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:56.005093" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:56.005326" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:56.005437" elapsed="0.000024"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:55.997624" elapsed="0.007964">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:56.005817" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:56.006049" elapsed="0.000027"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:56.006295" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:56.006554" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:56.006825" elapsed="0.000027"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:55.996513" elapsed="0.010459">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:57.011085" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:57.010305" elapsed="0.000852"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:57.011272" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:58:57.011658" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:57.009501" elapsed="0.002213"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:57.012746" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:57.012067" elapsed="0.003187">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:57.015571" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:57.015902" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:57.016151" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:57.016408" elapsed="0.000063"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:57.016690" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:57.016857" elapsed="0.000018"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:57.008657" elapsed="0.008309">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:57.017131" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:57.017297" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:57.017493" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:57.017672" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:57.017869" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:57.007711" elapsed="0.010266">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:58.022409" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:58.021887" elapsed="0.000571"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:58.022540" elapsed="0.000056"/>
</return>
<msg time="2026-04-11T00:58:58.022773" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:58.021028" elapsed="0.001781"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:58.023450" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:58.023033" elapsed="0.000952">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:58.024300" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:58.024654" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:58.024900" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:58.025182" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:58.025449" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:58.025544" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:58.020007" elapsed="0.005687">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:58.025923" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:58.026156" elapsed="0.000027"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:58.026456" elapsed="0.000041"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:58.026717" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:58.026988" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:58.018882" elapsed="0.008255">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:58:59.031674" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:58:59.030787" elapsed="0.000966"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:58:59.031878" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:58:59.032252" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:58:59.029879" elapsed="0.002433"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:58:59.033429" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:58:59.032726" elapsed="0.001613">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:59.034920" elapsed="0.000056"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:58:59.035705" elapsed="0.000064"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:59.036154" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:59.036600" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:59.037009" elapsed="0.000045"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:58:59.037162" elapsed="0.000037"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:59.028904" elapsed="0.008539">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:59.037869" elapsed="0.000027"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:59.038053" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:59.038501" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:59.038679" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:58:59.038875" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:58:59.027903" elapsed="0.011080">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:00.043581" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:00.042732" elapsed="0.000922"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:00.043778" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T00:59:00.044144" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:00.041718" elapsed="0.002483"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:00.045312" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:00.044637" elapsed="0.001546">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:00.046704" elapsed="0.000057"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:59:00.047242" elapsed="0.000064"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:00.047763" elapsed="0.000071"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:00.048200" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:00.048684" elapsed="0.000053"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:59:00.048848" elapsed="0.000040"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:00.040754" elapsed="0.008338">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:00.049524" elapsed="0.000053"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:00.049914" elapsed="0.000046"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:00.050441" elapsed="0.000055"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:00.050818" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:00.051018" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:00.039742" elapsed="0.011387">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:01.055191" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:01.054374" elapsed="0.000885"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:01.055546" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:59:01.055899" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:01.053576" elapsed="0.002378"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:01.056976" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:01.056305" elapsed="0.001497">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:01.058290" elapsed="0.000053"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:59:01.058933" elapsed="0.000061"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:01.059341" elapsed="0.000073"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:01.059758" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:01.060173" elapsed="0.000044"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:59:01.060314" elapsed="0.000034"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:01.052719" elapsed="0.007853">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:01.060956" elapsed="0.000052"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:01.061342" elapsed="0.000072"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:01.061773" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:01.062161" elapsed="0.000045"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:01.062640" elapsed="0.000047"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:01.051833" elapsed="0.011051">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:02.067955" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:02.067173" elapsed="0.000851"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:02.068143" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:59:02.068532" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:02.066302" elapsed="0.002288"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:02.069602" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:02.068944" elapsed="0.001405">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:02.070843" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:59:02.071413" elapsed="0.000057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:02.071817" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:02.072198" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:02.072610" elapsed="0.000047"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:59:02.072758" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:02.065467" elapsed="0.007523">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:02.073355" elapsed="0.000076"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:02.073762" elapsed="0.000045"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:02.074166" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:02.074707" elapsed="0.000048"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:02.075216" elapsed="0.000058"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:02.063887" elapsed="0.011624">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:03.079919" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:03.079033" elapsed="0.000967"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:03.080129" elapsed="0.000091"/>
</return>
<msg time="2026-04-11T00:59:03.080573" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:03.078134" elapsed="0.002500"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:03.081685" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:03.080989" elapsed="0.001630">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:03.083102" elapsed="0.000052"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:59:03.083769" elapsed="0.000060"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:03.084051" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:03.084224" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:03.084410" elapsed="0.000021"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:59:03.084478" elapsed="0.000019"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:03.077269" elapsed="0.007323">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:03.084762" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:03.084929" elapsed="0.000019"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:03.085109" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:03.085283" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:03.085499" elapsed="0.000023"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:03.076312" elapsed="0.009301">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:04.090414" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:04.089649" elapsed="0.000838"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:04.090601" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:59:04.090959" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:04.088806" elapsed="0.002212"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:04.092028" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:04.091370" elapsed="0.001454">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:04.093290" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:59:04.093870" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:04.094272" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:04.094726" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:04.095235" elapsed="0.000048"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:59:04.095414" elapsed="0.000040"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:04.087307" elapsed="0.008352">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:04.096028" elapsed="0.000046"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:04.096479" elapsed="0.000049"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:04.096889" elapsed="0.000052"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:04.097192" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:04.097401" elapsed="0.000022"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:04.086347" elapsed="0.011164">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:05.101777" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:05.100979" elapsed="0.000886"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:05.102001" elapsed="0.000104"/>
</return>
<msg time="2026-04-11T00:59:05.102500" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:05.100068" elapsed="0.002513"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:05.103815" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:05.103065" elapsed="0.001595">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:05.105187" elapsed="0.000052"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:59:05.105754" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:05.106161" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:05.106607" elapsed="0.000063"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:05.107026" elapsed="0.000048"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:59:05.107173" elapsed="0.000038"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:05.099209" elapsed="0.008239">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:05.107837" elapsed="0.000063"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:05.108254" elapsed="0.000047"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:05.108730" elapsed="0.000078"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:05.109223" elapsed="0.000053"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:05.109714" elapsed="0.000048"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:05.098263" elapsed="0.011699">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:06.114661" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:06.114121" elapsed="0.000593"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:06.114795" elapsed="0.000056"/>
</return>
<msg time="2026-04-11T00:59:06.115028" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:06.112598" elapsed="0.002472"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:06.115761" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:06.115341" elapsed="0.000936">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:06.116707" elapsed="0.000034"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:59:06.117036" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:06.117304" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:06.117570" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:06.117811" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:59:06.117903" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:06.111702" elapsed="0.006351">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:06.118284" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:06.118542" elapsed="0.000030"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:06.118798" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:06.119042" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:06.119323" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:06.110740" elapsed="0.008757">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:07.123273" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:07.122732" elapsed="0.000589"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:07.123431" elapsed="0.000059"/>
</return>
<msg time="2026-04-11T00:59:07.123668" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:07.122150" elapsed="0.001555"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:07.124329" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:07.123927" elapsed="0.000942">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:07.125163" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:59:07.125510" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:07.125758" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:07.126063" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:07.126330" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:59:07.126445" elapsed="0.000025"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:07.121242" elapsed="0.005356">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:07.126826" elapsed="0.000028"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:07.127056" elapsed="0.000027"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:07.127302" elapsed="0.000029"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:07.127561" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:07.127836" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:07.120285" elapsed="0.007700">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:08.132960" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:08.131635" elapsed="0.001398"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:08.133152" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:59:08.133548" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:08.130604" elapsed="0.003002"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:08.134644" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:08.133964" elapsed="0.001595">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:08.136060" elapsed="0.000052"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:59:08.136621" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:08.137023" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:08.137444" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:08.137834" elapsed="0.000045"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:59:08.137980" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:08.129714" elapsed="0.008499">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:08.138662" elapsed="0.000050"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:08.139045" elapsed="0.000046"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:08.139346" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:08.139535" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:08.139735" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:08.128785" elapsed="0.011058">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:09.144044" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:09.143268" elapsed="0.000845"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:09.144229" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T00:59:09.144612" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:09.142362" elapsed="0.002306"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:09.145677" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:09.145021" elapsed="0.001438">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:09.146940" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:59:09.147492" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:09.147890" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:09.148271" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:09.148683" elapsed="0.000046"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:59:09.148828" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:09.141537" elapsed="0.007523">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:09.149458" elapsed="0.000049"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:09.149837" elapsed="0.000044"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:09.150364" elapsed="0.000081"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:09.150794" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:09.151259" elapsed="0.000047"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:09.140588" elapsed="0.010944">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:10.156051" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:10.155178" elapsed="0.000944"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:10.156278" elapsed="0.000146"/>
</return>
<msg time="2026-04-11T00:59:10.156763" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:10.154245" elapsed="0.002575"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:10.158360" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:10.157178" elapsed="0.001979">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.159784" elapsed="0.000070"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.160363" elapsed="0.000079"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.160607" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.160777" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.160946" elapsed="0.000019"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T00:59:10.161008" elapsed="0.000016"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:10.153347" elapsed="0.007771">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.161281" elapsed="0.000020"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.161461" elapsed="0.000022"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.161642" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.161813" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.162007" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T00:59:10.152299" elapsed="0.009814">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:59:10.162199" level="FAIL">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>Check Flow Stats Are Not Frozen</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:58:39.829575" elapsed="30.332715">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check that duration flow stat is increasing.</doc>
<status status="FAIL" start="2026-04-11T00:58:39.816183" elapsed="30.346287">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t33" name="Remove Flows And Groups After Owner Disconnected" line="249">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:59:10.165955" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:59:10.165688" elapsed="0.000529"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:59:10.167526" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:59:10.167347" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-11T00:59:10.167324" elapsed="0.000279"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:59:10.172448" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:59:10.172323" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T00:59:10.172302" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:59:10.173612" 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-11T00:59:10.173203" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:59:10.174107" 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-11T00:59:10.173802" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:59:10.174179" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T00:59:10.174335" 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-11T00:59:10.172814" elapsed="0.001545"/>
</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-11T00:59:10.174745" 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-11T00:59:10.175008" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:59:10.174843" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:59:10.174826" elapsed="0.000263"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:59:10.174599" elapsed="0.000513"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:59:10.174436" elapsed="0.000702"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:59:10.171960" elapsed="0.003232"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:59:10.167049" elapsed="0.008196"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:59:10.166600" elapsed="0.008690"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:59:10.163216" elapsed="0.012125"/>
</kw>
<kw name="Remove Single Group And Flow On Member">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:10.176550" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:10.176232" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:10.176625" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T00:59:10.176771" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:10.175876" elapsed="0.000920"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:10.179734" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A${switch}/flow-node-inventory:table=0/flow=1</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:10.179468" elapsed="0.000585">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="DELETE On Session" owner="RequestsLibrary">
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A${switch}/flow-node-inventory:group=1</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.180227" elapsed="0.000022"/>
</kw>
<kw name="DELETE On Session" owner="RequestsLibrary">
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A${switch}/flow-node-inventory:group=1000</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.180415" elapsed="0.000022"/>
</kw>
<var name="${switch}">1</var>
<status status="FAIL" start="2026-04-11T00:59:10.179293" elapsed="0.001198">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="FAIL" start="2026-04-11T00:59:10.176846" elapsed="0.003702">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</for>
<doc>Remove 1 group 1&amp;2 and 1 flow in every switch.</doc>
<status status="FAIL" start="2026-04-11T00:59:10.175552" elapsed="0.005090">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Remove 1 group 1&amp;2 and 1 flow in every switch.</doc>
<status status="FAIL" start="2026-04-11T00:59:10.162696" elapsed="0.018071">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t34" name="Check Flows In Operational DS After Owner Disconnected" line="253">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:59:10.184748" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:59:10.184479" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:59:10.186021" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:59:10.185912" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-11T00:59:10.185892" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:59:10.190972" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:59:10.190864" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T00:59:10.190844" elapsed="0.000231"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:59:10.192101" 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-11T00:59:10.191723" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:59:10.192612" 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-11T00:59:10.192301" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:59:10.192684" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:59:10.192837" 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-11T00:59:10.191315" elapsed="0.001547"/>
</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-11T00:59:10.193205" 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-11T00:59:10.193484" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:59:10.193316" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:59:10.193297" elapsed="0.000266"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:59:10.193061" elapsed="0.000525"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:59:10.192913" elapsed="0.000698"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:59:10.190504" elapsed="0.003159"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:59:10.185627" elapsed="0.008089"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:59:10.185176" elapsed="0.008583"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:59:10.181785" elapsed="0.012026"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:10.195627" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:10.195273" elapsed="0.000382"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:10.195700" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T00:59:10.195847" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:10.194929" elapsed="0.000943"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:10.196476" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:10.196027" elapsed="0.000754">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.196989" elapsed="0.000022"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.197182" elapsed="0.000020"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:10.197405" elapsed="0.000022"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:10.194549" elapsed="0.002973">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:11.201470" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:11.200679" elapsed="0.000865"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:11.201664" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:59:11.202022" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:11.199673" elapsed="0.002404"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:11.203005" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:11.202460" elapsed="0.001326">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:11.204314" elapsed="0.000059"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:11.204790" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:11.205355" elapsed="0.000078"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:11.198557" elapsed="0.007090">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:12.209340" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:12.208583" elapsed="0.000858"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:12.209562" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:59:12.209919" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:12.207704" elapsed="0.002273"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:12.210911" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:12.210334" elapsed="0.001364">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:12.212156" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:12.212632" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:12.213071" elapsed="0.000046"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:12.206639" elapsed="0.006682">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:13.215279" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:13.214917" elapsed="0.000399"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:13.215376" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T00:59:13.215585" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:13.214545" elapsed="0.001066"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:13.216021" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:13.215770" elapsed="0.000648">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:13.216637" elapsed="0.000022"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:13.216834" elapsed="0.000021"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:13.217032" elapsed="0.000287"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:13.213976" elapsed="0.003465">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:14.221092" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:14.220300" elapsed="0.000863"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:14.221284" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:59:14.221824" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:14.219497" elapsed="0.002385"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:14.222667" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:14.222236" elapsed="0.000942">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:14.223496" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:14.223763" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:14.224033" elapsed="0.000028"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:14.218351" elapsed="0.005842">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:15.227957" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:15.227152" elapsed="0.001022"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:15.228304" elapsed="0.000114"/>
</return>
<msg time="2026-04-11T00:59:15.228708" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:15.226314" elapsed="0.002450"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:15.229695" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:15.229112" elapsed="0.001409">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:15.230982" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:15.231440" elapsed="0.000051"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:15.231888" elapsed="0.000045"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:15.225149" elapsed="0.006990">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:16.236065" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:16.235239" elapsed="0.000900"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:16.236258" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:59:16.236688" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:16.234270" elapsed="0.002479"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:16.237843" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:16.237153" elapsed="0.001790">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:16.239482" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:16.239909" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:16.240434" elapsed="0.000051"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:16.233146" elapsed="0.007555">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:17.244952" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:17.244160" elapsed="0.000864"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:17.245144" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:59:17.245533" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:17.243333" elapsed="0.002256"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:17.246520" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:17.245941" elapsed="0.001382">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:17.247815" elapsed="0.000048"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:17.248228" elapsed="0.000042"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:17.248680" elapsed="0.000043"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:17.241662" elapsed="0.007266">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:18.252572" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:18.251800" elapsed="0.000843"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:18.252759" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:59:18.253110" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:18.250951" elapsed="0.002214"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:18.254087" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:18.253544" elapsed="0.001310">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:18.255465" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:18.255953" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:18.256424" elapsed="0.000048"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:18.249898" elapsed="0.006767">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:19.258724" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:19.258355" elapsed="0.000403"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:19.258816" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T00:59:19.258982" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:19.257992" elapsed="0.001015"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:19.259428" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:19.259165" elapsed="0.000641">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:19.260021" elapsed="0.000022"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:19.260209" elapsed="0.000020"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:19.260440" elapsed="0.000021"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:19.257423" elapsed="0.003132">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:20.264509" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:20.263697" elapsed="0.000885"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:20.264709" elapsed="0.000707"/>
</return>
<msg time="2026-04-11T00:59:20.265725" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:20.262855" elapsed="0.002913"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:20.266351" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:20.265998" elapsed="0.000921">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:20.267230" elapsed="0.000030"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:20.267516" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:20.267792" elapsed="0.000028"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:20.261552" elapsed="0.006405">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:21.271690" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:21.270899" elapsed="0.000861"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:21.271882" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T00:59:21.272242" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:21.270040" elapsed="0.002255"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:21.273267" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:21.272713" elapsed="0.001272">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:21.274285" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:21.274573" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:21.274846" elapsed="0.000028"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:21.268901" elapsed="0.006210">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:22.278905" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:22.278080" elapsed="0.000897"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:22.279102" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:59:22.279511" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:22.277163" elapsed="0.002409"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:22.280562" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:22.279949" elapsed="0.001422">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:22.281916" elapsed="0.000056"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:22.282375" elapsed="0.000088"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:22.282884" elapsed="0.000046"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:22.276055" elapsed="0.007082">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:23.286569" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:23.285802" elapsed="0.000833"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:23.286749" elapsed="0.000074"/>
</return>
<msg time="2026-04-11T00:59:23.287091" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:23.284983" elapsed="0.002162"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:23.288053" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:23.287519" elapsed="0.004151">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:23.291969" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:23.292237" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:23.292530" elapsed="0.000029"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:23.283969" elapsed="0.008724">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:24.297187" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:24.296451" elapsed="0.000802"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:24.297371" elapsed="0.000108"/>
</return>
<msg time="2026-04-11T00:59:24.297753" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:24.295617" elapsed="0.002191"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:24.298725" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:24.298157" elapsed="0.001360">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:24.299979" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:24.300434" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:24.300875" elapsed="0.000046"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:24.293604" elapsed="0.007523">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:25.304499" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:25.303994" elapsed="0.000551"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:25.304621" elapsed="0.000053"/>
</return>
<msg time="2026-04-11T00:59:25.304945" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:25.303107" elapsed="0.001874"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:25.305584" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:25.305201" elapsed="0.000888">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:25.306419" elapsed="0.000033"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:25.306691" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:25.307052" elapsed="0.000038"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:25.302080" elapsed="0.005153">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:26.310939" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:26.310143" elapsed="0.000865"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:26.311126" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:59:26.311514" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:26.309306" elapsed="0.002265"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:26.312554" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:26.311924" elapsed="0.001293">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:26.313544" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:26.313812" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:26.314086" elapsed="0.000028"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:26.308198" elapsed="0.006047">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:27.318784" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:27.317916" elapsed="0.000947"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:27.318991" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T00:59:27.319381" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:27.316331" elapsed="0.003151"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:27.320667" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:27.319925" elapsed="0.001745">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:27.322180" elapsed="0.000055"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:27.322681" elapsed="0.000051"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:27.323168" elapsed="0.000067"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:27.315188" elapsed="0.008335">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:28.327239" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:28.326496" elapsed="0.000813"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:28.327461" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:59:28.327822" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:28.325665" elapsed="0.002212"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:28.328796" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:28.328219" elapsed="0.001394">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:28.330073" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:28.330669" elapsed="0.000050"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:28.331109" elapsed="0.000046"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:28.324530" elapsed="0.006832">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:29.335282" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:29.334539" elapsed="0.000812"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:29.335535" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:59:29.335901" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:29.333633" elapsed="0.002324"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:29.336915" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:29.336339" elapsed="0.001399">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:29.338202" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:29.338656" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:29.339105" elapsed="0.000049"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:29.332350" elapsed="0.007010">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:30.343008" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:30.342240" elapsed="0.000835"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:30.343191" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T00:59:30.343584" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:30.341410" elapsed="0.002230"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:30.345097" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:30.343990" elapsed="0.001887">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:30.346419" elapsed="0.000055"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:30.346857" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:30.347215" elapsed="0.000028"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:30.340320" elapsed="0.007056">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:31.351125" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:31.350293" elapsed="0.000902"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:31.351314" elapsed="0.000109"/>
</return>
<msg time="2026-04-11T00:59:31.351707" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:31.349490" elapsed="0.002273"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:31.352691" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:31.352114" elapsed="0.001352">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:31.353928" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:31.354353" elapsed="0.000075"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:31.354840" elapsed="0.000046"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:31.348335" elapsed="0.006757">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:32.358889" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:32.358094" elapsed="0.000864"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:32.359077" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:59:32.359505" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:32.357245" elapsed="0.002320"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:32.360502" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:32.359923" elapsed="0.001321">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:32.361739" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:32.362174" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:32.362648" elapsed="0.000049"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:32.356139" elapsed="0.006766">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:33.366562" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:33.365799" elapsed="0.000831"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:33.366748" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:59:33.367096" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:33.364969" elapsed="0.002182"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:33.368179" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:33.367533" elapsed="0.001546">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:33.369585" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:33.370014" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:33.370487" elapsed="0.000047"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:33.363926" elapsed="0.006815">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:34.375116" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:34.374293" elapsed="0.000894"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:34.375734" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T00:59:34.376125" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:34.373422" elapsed="0.002765"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:34.377274" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:34.376714" elapsed="0.001088">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:34.378101" elapsed="0.000030"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:34.378364" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:34.378657" elapsed="0.000029"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:34.371665" elapsed="0.007152">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:35.381910" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:35.381220" elapsed="0.000754"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:35.382079" elapsed="0.000075"/>
</return>
<msg time="2026-04-11T00:59:35.382413" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:35.380309" elapsed="0.002154"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:35.383269" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:35.382868" elapsed="0.001002">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:35.384199" elapsed="0.000033"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:35.384558" elapsed="0.000039"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:35.384913" elapsed="0.000033"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:35.379611" elapsed="0.005475">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:36.389034" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:36.388253" elapsed="0.000850"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:36.389220" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:59:36.389639" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:36.387439" elapsed="0.002259"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:36.390646" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:36.390061" elapsed="0.001497">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:36.392041" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:36.392511" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:36.392959" elapsed="0.000048"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:36.386066" elapsed="0.007155">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:37.396958" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:37.396171" elapsed="0.000860"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:37.397150" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:59:37.397543" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:37.395348" elapsed="0.002250"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:37.398918" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:37.397986" elapsed="0.001515">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:37.399819" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:37.400104" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:37.400412" elapsed="0.000031"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:37.394265" elapsed="0.006320">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:38.404171" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:38.403438" elapsed="0.000799"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:38.404352" elapsed="0.000117"/>
</return>
<msg time="2026-04-11T00:59:38.404749" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:38.402611" elapsed="0.002195"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:38.405726" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:38.405155" elapsed="0.001356">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:38.406964" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:38.407417" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:38.408000" elapsed="0.000050"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:38.401547" elapsed="0.006711">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:39.410256" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:39.409885" elapsed="0.000406"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:39.410351" elapsed="0.000059"/>
</return>
<msg time="2026-04-11T00:59:39.410542" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:39.409503" elapsed="0.001065"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:39.411022" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:39.410732" elapsed="0.000703">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:39.411662" elapsed="0.000023"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:39.411858" elapsed="0.000021"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:39.412058" elapsed="0.000021"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:39.408902" elapsed="0.003273">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:40.415768" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:40.414968" elapsed="0.000869"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:40.415953" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:59:40.416309" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:40.414137" elapsed="0.002230"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:40.417296" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:40.416752" elapsed="0.001345">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:40.418597" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:40.419019" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:40.419481" elapsed="0.000069"/>
</kw>
<arg>${less_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:40.413100" elapsed="0.006675">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:59:40.419964" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Flows On Member</arg>
<arg>${less_flows}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:59:10.193976" elapsed="30.226186">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Flows in Operational DS.</doc>
<status status="FAIL" start="2026-04-11T00:59:10.181192" elapsed="30.239335">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t35" name="Check Groups In Operational DS After Owner Disconnected" line="261">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:59:40.426448" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:59:40.426165" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:59:40.427781" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:59:40.427656" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T00:59:40.427633" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:59:40.432652" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:59:40.432545" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T00:59:40.432526" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:59:40.433730" 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-11T00:59:40.433329" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:59:40.434287" 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-11T00:59:40.433994" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:59:40.434359" elapsed="0.000045"/>
</return>
<msg time="2026-04-11T00:59:40.434533" 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-11T00:59:40.432952" elapsed="0.001606"/>
</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-11T00:59:40.434920" 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-11T00:59:40.435168" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:59:40.435018" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:59:40.435001" elapsed="0.000245"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:59:40.434774" elapsed="0.000496"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:59:40.434615" elapsed="0.000681"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:59:40.432165" elapsed="0.003186"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:59:40.427329" elapsed="0.008094"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:59:40.426880" elapsed="0.008589"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:59:40.423050" elapsed="0.012472"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:40.437300" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:40.437009" elapsed="0.000318"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:40.437372" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T00:59:40.437537" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:40.436663" elapsed="0.000899"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:40.437947" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:40.437716" elapsed="0.000533">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:40.438462" elapsed="0.000022"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:40.438649" elapsed="0.000020"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:40.438842" elapsed="0.000020"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:40.436268" elapsed="0.002685">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:41.443203" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:41.442466" elapsed="0.000806"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:41.443459" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:59:41.443822" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:41.440996" elapsed="0.002884"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:41.445055" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:41.444378" elapsed="0.001575">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:41.446484" elapsed="0.000059"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:41.446955" elapsed="0.000050"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:41.447454" elapsed="0.000051"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:41.439867" elapsed="0.007984">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:42.451779" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:42.450837" elapsed="0.001011"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:42.451966" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:59:42.452321" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:42.450001" elapsed="0.002376"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:42.453325" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:42.452779" elapsed="0.001326">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:42.454607" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:42.455039" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:42.455508" elapsed="0.000048"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:42.448914" elapsed="0.006852">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:43.459427" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:43.458668" elapsed="0.000829"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:43.459611" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:59:43.459965" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:43.457840" elapsed="0.002180"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:43.460935" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:43.460368" elapsed="0.001365">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:43.462188" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:43.462646" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:43.463083" elapsed="0.000045"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:43.456720" elapsed="0.006615">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:44.467212" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:44.466432" elapsed="0.000850"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:44.467437" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:59:44.467813" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:44.465525" elapsed="0.002347"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:44.469478" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:44.468244" elapsed="0.002080">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:44.470775" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:44.471041" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:44.471314" elapsed="0.000029"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:44.464352" elapsed="0.007141">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:45.473992" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:45.473505" elapsed="0.000531"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:45.474248" elapsed="0.000058"/>
</return>
<msg time="2026-04-11T00:59:45.474512" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:45.472971" elapsed="0.001577"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:45.475374" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:45.474808" elapsed="0.001341">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:45.476641" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:45.477081" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:45.477553" elapsed="0.000047"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:45.472159" elapsed="0.005647">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:46.481619" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:46.480814" elapsed="0.000874"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:46.481810" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:59:46.482176" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:46.479972" elapsed="0.002260"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:46.483225" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:46.482622" elapsed="0.001457">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:46.484572" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:46.485024" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:46.485485" elapsed="0.000045"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:46.478857" elapsed="0.006890">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:47.489476" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:47.488711" elapsed="0.000835"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:47.489663" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:59:47.490142" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:47.487893" elapsed="0.002307"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:47.491151" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:47.490584" elapsed="0.001409">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:47.492478" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:47.492908" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:47.493346" elapsed="0.000073"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:47.486834" elapsed="0.006795">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:48.497945" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:48.497172" elapsed="0.000841"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:48.498132" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T00:59:48.498519" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:48.496348" elapsed="0.002227"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:48.499494" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:48.498928" elapsed="0.001335">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:48.500873" elapsed="0.000054"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:48.501307" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:48.501776" elapsed="0.000047"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:48.495211" elapsed="0.006821">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:49.505711" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:49.504930" elapsed="0.000858"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:49.505918" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T00:59:49.506278" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:49.504049" elapsed="0.002284"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:49.507263" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:49.506721" elapsed="0.001320">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:49.508548" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:49.508977" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:49.509442" elapsed="0.000048"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:49.503007" elapsed="0.006693">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:50.513359" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:50.512587" elapsed="0.000873"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:50.513577" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T00:59:50.513936" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:50.511763" elapsed="0.002231"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:50.514911" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:50.514341" elapsed="0.001348">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:50.516142" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:50.516597" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:50.517059" elapsed="0.000046"/>
</kw>
<arg>${less_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T00:59:50.510692" elapsed="0.006615">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T00:59:50.517525" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Groups On Member</arg>
<arg>${less_groups}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:59:40.435736" elapsed="10.081989">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Groups in Operational DS.</doc>
<status status="FAIL" start="2026-04-11T00:59:40.421236" elapsed="10.096817">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t36" name="Check Flows In Switch After Owner Disconnected" line="269">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:59:50.527264" elapsed="0.000517"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:59:50.526663" elapsed="0.001241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:59:50.530339" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:59:50.530156" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-11T00:59:50.530120" elapsed="0.000349"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:59:50.537697" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:59:50.537544" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-11T00:59:50.537517" elapsed="0.000357"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:59:50.539449" 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-11T00:59:50.538766" elapsed="0.000736"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:59:50.540221" 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-11T00:59:50.539778" elapsed="0.000494"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:59:50.540343" elapsed="0.000069"/>
</return>
<msg time="2026-04-11T00:59:50.540654" 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-11T00:59:50.538202" elapsed="0.002493"/>
</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-11T00:59:50.541274" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:50.541652" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:59:50.541439" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:59:50.541412" elapsed="0.000349"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:59:50.541060" elapsed="0.000734"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:59:50.540776" elapsed="0.001054"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:59:50.536991" elapsed="0.004925"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:59:50.529476" elapsed="0.012533"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:59:50.528252" elapsed="0.013826"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:59:50.520302" elapsed="0.021835"/>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<msg time="2026-04-11T00:59:50.546444" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<arg>${less_flows}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-11T00:59:50.542419" elapsed="0.004071">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Check Flows in switch.</doc>
<status status="FAIL" start="2026-04-11T00:59:50.518936" elapsed="0.027719">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s4-t37" name="Disconnect Mininet From Cluster" line="273">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:59:50.550829" elapsed="0.000237"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:59:50.550518" elapsed="0.000618"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:59:50.552305" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:59:50.552186" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T00:59:50.552166" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:59:50.557589" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:59:50.557482" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T00:59:50.557464" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:59:50.558646" 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-11T00:59:50.558256" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:59:50.559120" 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-11T00:59:50.558833" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:59:50.559189" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:59:50.559340" 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-11T00:59:50.557883" elapsed="0.001481"/>
</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-11T00:59:50.559723" 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-11T00:59:50.559967" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:59:50.559817" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:59:50.559801" elapsed="0.000291"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:59:50.559581" elapsed="0.000534"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:59:50.559432" elapsed="0.000708"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:59:50.557106" elapsed="0.003086"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:59:50.551868" elapsed="0.008377"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:59:50.551331" elapsed="0.008957"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:59:50.547612" elapsed="0.012725"/>
</kw>
<kw name="Disconnect Cluster Mininet" owner="MininetKeywords">
<msg time="2026-04-11T00:59:50.564668" level="FAIL">Variable '${original_owner_list}' not found.</msg>
<arg>break</arg>
<arg>${original_owner_list}</arg>
<doc>Break and restore controller to mininet connection via iptables.</doc>
<status status="FAIL" start="2026-04-11T00:59:50.560616" elapsed="0.004089">Variable '${original_owner_list}' not found.</status>
</kw>
<doc>Disconnect Mininet from Cluster.</doc>
<status status="FAIL" start="2026-04-11T00:59:50.547018" elapsed="0.017818">Variable '${original_owner_list}' not found.</status>
</test>
<test id="s1-s4-t38" name="Check No Switches After Disconnect" line="277">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T00:59:50.568071" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T00:59:50.567809" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T00:59:50.569339" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:59:50.569232" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-11T00:59:50.569213" 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-11T00:59:50.574147" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T00:59:50.574041" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T00:59:50.574023" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T00:59:50.575194" 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-11T00:59:50.574824" elapsed="0.000397"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T00:59:50.575680" 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-11T00:59:50.575396" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T00:59:50.575749" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:59:50.575899" 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-11T00:59:50.574453" elapsed="0.001470"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:50.576265" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:50.576523" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T00:59:50.576359" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-11T00:59:50.576343" elapsed="0.000256"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T00:59:50.576121" elapsed="0.000502"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T00:59:50.575978" elapsed="0.000668"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T00:59:50.573684" elapsed="0.003015"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T00:59:50.568945" elapsed="0.007807"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T00:59:50.568499" elapsed="0.008297"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T00:59:50.565539" elapsed="0.011307"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:50.578635" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:50.578325" elapsed="0.000336"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:50.578706" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T00:59:50.578896" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:50.577981" elapsed="0.000943"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:50.579313" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:50.579079" elapsed="0.000586">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:50.579868" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:50.580144" elapsed="0.000021"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:59:50.579992" elapsed="0.000206"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:59:50.579941" elapsed="0.000283"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T00:59:50.577611" elapsed="0.002704">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:51.586890" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:51.586370" elapsed="0.000567"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:51.587016" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T00:59:51.587247" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:51.582632" elapsed="0.004649"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:51.587876" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:51.587526" elapsed="0.000863">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:51.588699" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:51.589094" elapsed="0.000029"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:59:51.588882" elapsed="0.000289"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:59:51.588802" elapsed="0.000432"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T00:59:51.581377" elapsed="0.007992">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:52.593152" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:52.592328" elapsed="0.000900"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:52.593346" elapsed="0.000111"/>
</return>
<msg time="2026-04-11T00:59:52.593743" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:52.591535" elapsed="0.002264"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:52.594753" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:52.594177" elapsed="0.001359">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:52.595994" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:52.596646" elapsed="0.000047"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:59:52.596269" elapsed="0.000504"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:59:52.596149" elapsed="0.000684"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T00:59:52.590460" elapsed="0.006585">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:53.601001" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:53.600222" elapsed="0.000850"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:53.601187" elapsed="0.000075"/>
</return>
<msg time="2026-04-11T00:59:53.601574" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:53.599379" elapsed="0.002252"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:53.602554" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:53.601982" elapsed="0.001325">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:53.603622" elapsed="0.000124"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:53.604127" elapsed="0.000029"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:59:53.603909" elapsed="0.000296"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:59:53.603829" elapsed="0.000414"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T00:59:53.598181" elapsed="0.006198">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:54.608349" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:54.607561" elapsed="0.000897"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:54.608584" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T00:59:54.608963" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:54.606659" elapsed="0.002364"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:54.652247" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:54.609439" elapsed="0.043304">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:54.653006" elapsed="0.000028"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:54.653323" elapsed="0.000021"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:59:54.653164" elapsed="0.000214"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:59:54.653088" elapsed="0.000338"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T00:59:54.605487" elapsed="0.048044">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:55.657316" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:55.656562" elapsed="0.000857"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:55.657541" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T00:59:55.657896" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:55.655686" elapsed="0.002267"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:55.658882" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:55.658305" elapsed="0.001366">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:55.660132" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:55.660816" elapsed="0.000047"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:59:55.660470" elapsed="0.000472"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:59:55.660316" elapsed="0.000686"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T00:59:55.654607" elapsed="0.006599">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:56.665437" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:56.664612" elapsed="0.000903"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:56.665635" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T00:59:56.665998" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:56.663643" elapsed="0.002410"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:56.666999" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:56.666441" elapsed="0.001401">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:56.668354" elapsed="0.000086"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:56.669032" elapsed="0.000048"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:59:56.668684" elapsed="0.000476"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:59:56.668556" elapsed="0.000669"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T00:59:56.662452" elapsed="0.007015">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:57.673046" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:57.672245" elapsed="0.000848"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:57.673174" elapsed="0.000058"/>
</return>
<msg time="2026-04-11T00:59:57.673467" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:57.671729" elapsed="0.001776"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:57.674117" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:57.673764" elapsed="0.000913">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:57.675025" elapsed="0.000044"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:57.675546" elapsed="0.000030"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:59:57.675304" elapsed="0.000323"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:59:57.675210" elapsed="0.000456"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T00:59:57.670822" elapsed="0.004978">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:58.679524" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:58.678747" elapsed="0.000848"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:58.679713" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T00:59:58.680092" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:58.677847" elapsed="0.002302"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:58.681083" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:58.680538" elapsed="0.001325">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:58.682319" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:58.682982" elapsed="0.000048"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:59:58.682639" elapsed="0.000470"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:59:58.682513" elapsed="0.000656"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T00:59:58.676778" elapsed="0.006610">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T00:59:59.688113" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T00:59:59.687149" elapsed="0.001049"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T00:59:59.688355" elapsed="0.000140"/>
</return>
<msg time="2026-04-11T00:59:59.688844" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T00:59:59.686149" elapsed="0.002756"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T00:59:59.690060" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T00:59:59.689349" elapsed="0.001688">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:59.691717" elapsed="0.000074"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T00:59:59.692503" elapsed="0.000031"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T00:59:59.692124" elapsed="0.000463"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T00:59:59.691924" elapsed="0.000716"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T00:59:59.684861" elapsed="0.007935">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:00.696964" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:00.696054" elapsed="0.001012"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:00.697203" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:00:00.697634" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:00.695025" elapsed="0.002671"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:00.699536" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:00.698210" elapsed="0.002145">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:00.700691" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:00.701090" elapsed="0.000030"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:00.700873" elapsed="0.000298"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:00.700794" elapsed="0.000415"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:00.693857" elapsed="0.007485">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:01.705053" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:01.704276" elapsed="0.000846"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:01.705238" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:00:01.705678" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:01.703472" elapsed="0.002266"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:01.706610" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:01.706091" elapsed="0.001016">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:01.707423" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:01.707819" elapsed="0.000030"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:01.707604" elapsed="0.000294"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:01.707524" elapsed="0.000411"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:01.702371" elapsed="0.005693">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:02.711852" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:02.710993" elapsed="0.000930"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:02.712042" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:00:02.712422" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:02.710159" elapsed="0.002301"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:02.713033" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:02.712684" elapsed="0.000903">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:02.713887" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:02.714282" elapsed="0.000030"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:02.714066" elapsed="0.000294"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:02.713987" elapsed="0.000441"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:02.709091" elapsed="0.005471">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:03.718359" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:03.717593" elapsed="0.000872"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:03.718592" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T01:00:03.718956" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:03.716750" elapsed="0.002261"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:03.719942" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:03.719359" elapsed="0.001955">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:03.721639" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:03.722142" elapsed="0.000030"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:03.721924" elapsed="0.000296"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:03.721838" elapsed="0.000421"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:03.715612" elapsed="0.006807">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:04.726327" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:04.725576" elapsed="0.000852"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:04.726552" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:00:04.726910" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:04.724621" elapsed="0.002345"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:04.727894" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:04.727320" elapsed="0.001423">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:04.729211" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:04.729768" elapsed="0.000029"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:04.729533" elapsed="0.000314"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:04.729369" elapsed="0.000517"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:04.723465" elapsed="0.006555">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:05.733705" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:05.732917" elapsed="0.000860"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:05.733897" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:00:05.734254" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:05.732047" elapsed="0.002263"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:05.735244" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:05.734696" elapsed="0.001341">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:05.736531" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:05.737183" elapsed="0.000047"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:05.736837" elapsed="0.000470"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:05.736712" elapsed="0.000656"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:05.731003" elapsed="0.006618">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:06.742178" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:06.741437" elapsed="0.000810"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:06.742364" elapsed="0.000108"/>
</return>
<msg time="2026-04-11T01:00:06.742749" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:06.740591" elapsed="0.002214"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:06.743748" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:06.743155" elapsed="0.001415">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:06.744897" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:06.745294" elapsed="0.000029"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:06.745076" elapsed="0.000295"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:06.744998" elapsed="0.000441"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:06.738965" elapsed="0.006607">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:07.750349" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:07.749464" elapsed="0.000986"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:07.750570" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T01:00:07.750939" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:07.748496" elapsed="0.002499"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:07.751942" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:07.751367" elapsed="0.001369">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:07.753193" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:07.753856" elapsed="0.000047"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:07.753508" elapsed="0.000473"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:07.753351" elapsed="0.000691"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:07.747429" elapsed="0.006824">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:08.757943" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:08.757162" elapsed="0.000851"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:08.758185" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:00:08.758580" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:08.756292" elapsed="0.002353"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:08.759266" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:08.758915" elapsed="0.000888">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:08.760098" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:08.760517" elapsed="0.000031"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:08.760279" elapsed="0.000320"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:08.760199" elapsed="0.000438"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:08.755237" elapsed="0.005530">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:09.764415" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:09.763627" elapsed="0.000861"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:09.764606" elapsed="0.000149"/>
</return>
<msg time="2026-04-11T01:00:09.765049" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:09.762793" elapsed="0.002312"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:09.765896" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:09.765490" elapsed="0.000919">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:09.766704" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:09.767101" elapsed="0.000029"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:09.766883" elapsed="0.000296"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:09.766804" elapsed="0.000414"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:09.761752" elapsed="0.005598">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:10.771961" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:10.771157" elapsed="0.000874"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:10.772148" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:00:10.772532" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:10.769347" elapsed="0.003240"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:10.773620" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:10.772942" elapsed="0.001533">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:10.774983" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:10.775676" elapsed="0.000027"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:10.775264" elapsed="0.000478"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:10.775143" elapsed="0.000626"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:10.768304" elapsed="0.007562">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:11.779574" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:11.778799" elapsed="0.000846"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:11.779767" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:00:11.780118" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:11.777961" elapsed="0.002215"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:11.781154" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:11.780563" elapsed="0.001354">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:11.782211" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:11.782634" elapsed="0.000030"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:11.782415" elapsed="0.000297"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:11.782312" elapsed="0.000440"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:11.776864" elapsed="0.006020">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:12.786612" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:12.785838" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:12.786799" elapsed="0.000130"/>
</return>
<msg time="2026-04-11T01:00:12.787207" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:12.785006" elapsed="0.002257"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:12.788102" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:12.787646" elapsed="0.000972">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:12.788912" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:12.789311" elapsed="0.000029"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:12.789092" elapsed="0.000316"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:12.789014" elapsed="0.000435"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:12.783928" elapsed="0.005654">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:13.793225" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:13.792432" elapsed="0.000864"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:13.793442" elapsed="0.000597"/>
</return>
<msg time="2026-04-11T01:00:13.794333" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:13.791599" elapsed="0.002819"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:13.795320" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:13.794778" elapsed="0.001326">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:13.796612" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:13.797244" elapsed="0.000047"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:13.796899" elapsed="0.000616"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:13.796776" elapsed="0.000803"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:13.790554" elapsed="0.007236">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:14.801680" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:14.800901" elapsed="0.000850"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:14.801868" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:00:14.802281" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:14.800003" elapsed="0.002336"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:14.803129" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:14.802731" elapsed="0.000920">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:14.803954" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:14.804351" elapsed="0.000049"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:14.804135" elapsed="0.000317"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:14.804055" elapsed="0.000434"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:14.798906" elapsed="0.005716">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:15.808215" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:15.807451" elapsed="0.000834"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:15.808430" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:00:15.808784" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:15.806628" elapsed="0.002212"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:15.809754" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:15.809188" elapsed="0.001342">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:15.810981" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:15.811650" elapsed="0.000050"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:15.811259" elapsed="0.000519"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:15.811136" elapsed="0.000702"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:15.805609" elapsed="0.006434">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:16.815889" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:16.815102" elapsed="0.000857"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:16.816088" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:00:16.816471" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:16.814257" elapsed="0.002274"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:16.818006" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:16.816935" elapsed="0.001602">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:16.818832" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:16.819240" elapsed="0.000029"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:16.819024" elapsed="0.000294"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:16.818942" elapsed="0.000414"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:16.813193" elapsed="0.006317">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:17.823750" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:17.822623" elapsed="0.001216"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:17.824140" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T01:00:17.824568" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:17.821688" elapsed="0.002959"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:17.825842" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:17.825125" elapsed="0.001595">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:17.827217" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:17.827889" elapsed="0.000048"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:17.827539" elapsed="0.000479"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:17.827377" elapsed="0.000705"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:17.820572" elapsed="0.007727">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:18.832947" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:18.831962" elapsed="0.001086"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:18.833224" elapsed="0.000107"/>
</return>
<msg time="2026-04-11T01:00:18.833757" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:18.830956" elapsed="0.002872"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:18.835002" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:18.834273" elapsed="0.001668">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:18.836421" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:18.836848" elapsed="0.000039"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:18.836622" elapsed="0.000338"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:18.836537" elapsed="0.000480"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:18.829630" elapsed="0.007547">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:19.840891" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:19.840073" elapsed="0.000888"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:19.841080" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:00:19.841469" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:19.839255" elapsed="0.002271"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:19.842446" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:19.841875" elapsed="0.001330">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:19.843687" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:19.844336" elapsed="0.000075"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:19.843970" elapsed="0.000522"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:19.843846" elapsed="0.000706"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:19.838179" elapsed="0.006580">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:20.849057" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:20.848288" elapsed="0.000839"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:20.849266" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:00:20.849653" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:20.847476" elapsed="0.002235"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:20.850641" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:20.850066" elapsed="0.001349">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.851990" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.852648" elapsed="0.000047"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:20.852272" elapsed="0.000500"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:20.852150" elapsed="0.000682"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:00:20.846442" elapsed="0.006599">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T01:00:20.853280" level="FAIL">Keyword 'ClusterOpenFlow.Check No Switches On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check No Switches On Member</arg>
<arg>${SWITCHES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T00:59:50.577038" elapsed="30.276477">Keyword 'ClusterOpenFlow.Check No Switches On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check no switches in topology.</doc>
<status status="FAIL" start="2026-04-11T00:59:50.565091" elapsed="30.288759">Keyword 'ClusterOpenFlow.Check No Switches On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t39" name="Check Switch Is Not Connected" line="281">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:00:20.857579" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:00:20.857293" elapsed="0.000554"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:00:20.858882" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:00:20.858756" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:20.858734" elapsed="0.000218"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:00:20.863917" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:00:20.863808" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:20.863790" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:00:20.864992" 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-11T01:00:20.864615" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:00:20.865521" 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-11T01:00:20.865181" elapsed="0.000367"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:00:20.865592" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:00:20.865745" 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-11T01:00:20.864222" elapsed="0.001548"/>
</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-11T01:00:20.866113" 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-11T01:00:20.866365" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:20.866209" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:20.866192" elapsed="0.000266"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:00:20.865969" elapsed="0.000514"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:00:20.865821" elapsed="0.000687"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:00:20.863445" elapsed="0.003116"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:00:20.858463" elapsed="0.008154"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:00:20.858005" elapsed="0.008656"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:00:20.854801" elapsed="0.011912"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>OvsManager.Should Be Disconnected</arg>
<arg>s1</arg>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<arg>update_data=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.870193" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:00:20.870038" elapsed="0.000224"/>
</iter>
<msg time="2026-04-11T01:00:20.870292" level="FAIL">Variable '@{cluster_index_list}' not found.</msg>
<var>${index}</var>
<value>@{cluster_index_list}</value>
<status status="FAIL" start="2026-04-11T01:00:20.866764" elapsed="0.003562">Variable '@{cluster_index_list}' not found.</status>
</for>
<doc>Check switch s1 is not connected to any controller.</doc>
<status status="FAIL" start="2026-04-11T01:00:20.854305" elapsed="0.016209">Variable '@{cluster_index_list}' not found.</status>
</test>
<test id="s1-s4-t40" name="Reconnect Mininet To Cluster" line="293">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:00:20.874463" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:00:20.874185" elapsed="0.000543"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:00:20.875709" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:00:20.875600" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:20.875581" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:00:20.880505" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:00:20.880398" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:20.880367" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:00:20.881593" 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-11T01:00:20.881166" elapsed="0.000454"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:00:20.882068" 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-11T01:00:20.881781" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:00:20.882139" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:00:20.882292" 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-11T01:00:20.880795" elapsed="0.001521"/>
</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-11T01:00:20.882676" 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-11T01:00:20.882917" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:20.882772" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:20.882756" elapsed="0.000236"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:00:20.882533" elapsed="0.000483"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:00:20.882368" elapsed="0.000672"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:00:20.880032" elapsed="0.003060"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:00:20.875301" elapsed="0.007846"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:00:20.874881" elapsed="0.008311"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:00:20.871610" elapsed="0.011634"/>
</kw>
<kw name="Disconnect Cluster Mininet" owner="MininetKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:00:20.886612" 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-11T01:00:20.886218" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:00:20.887082" 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-11T01:00:20.886799" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:00:20.887154" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:00:20.887306" 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-11T01:00:20.885845" elapsed="0.001485"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<var>${rule}</var>
<arg>OUTPUT -p all --source ${ODL_SYSTEM_${index}_IP} --destination ${TOOLS_SYSTEM_IP} -j DROP</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.887671" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${command}</var>
<arg>'${action}'=='restore'</arg>
<arg>sudo /sbin/iptables -D ${rule}</arg>
<arg>sudo /sbin/iptables -I ${rule}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.887852" elapsed="0.000020"/>
</kw>
<kw name="Log To Console" owner="BuiltIn">
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Logs the given message to the console.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.888049" elapsed="0.000020"/>
</kw>
<kw name="Run Command On Controller" owner="Utils">
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<arg>cmd=${command}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.888260" elapsed="0.000023"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${command}</var>
<arg>sudo /sbin/iptables -L -n</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.888490" elapsed="0.000022"/>
</kw>
<kw name="Run Command On Controller" owner="Utils">
<var>${output}</var>
<arg>cmd=${command}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.888703" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.888877" elapsed="0.000020"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:00:20.887536" elapsed="0.001391"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:00:20.887395" elapsed="0.001558"/>
</for>
<arg>restore</arg>
<doc>Break and restore controller to mininet connection via iptables.</doc>
<status status="PASS" start="2026-04-11T01:00:20.883520" elapsed="0.005486"/>
</kw>
<doc>Reconnect mininet to cluster by removing Iptables drop rules that were used to disconnect</doc>
<status status="PASS" start="2026-04-11T01:00:20.870952" elapsed="0.018150"/>
</test>
<test id="s1-s4-t41" name="Check Linear Topology After Mininet Reconnects" line="297">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:00:20.892753" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:00:20.892492" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:00:20.894021" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:00:20.893915" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:20.893896" 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-11T01:00:20.898924" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:00:20.898820" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:20.898802" elapsed="0.000188"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:00:20.899974" 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-11T01:00:20.899603" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:00:20.900461" 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-11T01:00:20.900161" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:00:20.900531" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:00:20.900681" 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-11T01:00:20.899216" elapsed="0.001489"/>
</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-11T01:00:20.901040" 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-11T01:00:20.901291" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:20.901135" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:20.901118" elapsed="0.000249"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:00:20.900898" elapsed="0.000506"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:00:20.900754" elapsed="0.000677"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:00:20.898469" elapsed="0.003012"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:00:20.893635" elapsed="0.007898"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:00:20.893161" elapsed="0.008416"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:00:20.890021" elapsed="0.011605"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:20.903680" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:20.903370" elapsed="0.000337"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:20.903754" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:00:20.903899" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:20.903027" elapsed="0.000896"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:20.904309" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:20.904077" elapsed="0.000552">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.904860" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.905281" elapsed="0.000023"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.905488" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.905674" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.905857" elapsed="0.000019"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.906039" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.906223" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.906482" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:20.906307" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:20.906290" elapsed="0.000270"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.906772" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:20.906612" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:20.906597" elapsed="0.000251"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:20.907057" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:20.906899" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:20.906885" elapsed="0.000248"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:20.905103" elapsed="0.002053"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:20.904928" elapsed="0.002252"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:00:20.902651" elapsed="0.004621">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:21.911308" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:21.910477" elapsed="0.000952"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:21.911559" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T01:00:21.912025" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:21.909609" elapsed="0.002485"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:21.913050" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:21.912492" elapsed="0.001349">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:21.914356" elapsed="0.000079"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:21.915286" elapsed="0.000038"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:21.915594" elapsed="0.000040"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:21.915866" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:21.916127" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:21.916407" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:21.916701" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:21.917114" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:21.916834" elapsed="0.000371"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:21.916808" elapsed="0.000434"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:21.917618" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:21.917354" elapsed="0.000441"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:21.917325" elapsed="0.000509"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:21.918137" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:21.917912" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:21.917889" elapsed="0.000389"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:21.914945" elapsed="0.003367"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:21.914550" elapsed="0.003800"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:00:21.908549" elapsed="0.009959">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:22.925108" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:22.924309" elapsed="0.000880"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:22.925309" elapsed="0.000110"/>
</return>
<msg time="2026-04-11T01:00:22.925705" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:22.923460" elapsed="0.002301"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:22.926687" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:22.926111" elapsed="0.001347">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:22.927933" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:22.928878" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:22.929302" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:22.929745" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:22.930154" elapsed="0.000043"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:22.930592" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:22.931011" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:22.931666" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:22.931205" elapsed="0.000604"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:22.931165" elapsed="0.000699"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:22.932333" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:22.931985" elapsed="0.000446"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:22.931950" elapsed="0.000514"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:22.932770" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:22.932539" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:22.932516" elapsed="0.000363"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:22.928529" elapsed="0.004381"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:22.928094" elapsed="0.004851"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:00:22.919765" elapsed="0.013313">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:23.935535" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:23.935146" elapsed="0.000425"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:23.935633" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T01:00:23.935803" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:23.934775" elapsed="0.001055"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:23.936240" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:23.935988" elapsed="0.000681">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:23.936884" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:23.937401" elapsed="0.000023"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:23.937594" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:23.937779" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:23.937964" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:23.938148" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:23.938336" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:23.938609" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:23.938443" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:23.938423" elapsed="0.000266"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:23.938901" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:23.938742" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:23.938727" elapsed="0.000252"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:23.939191" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:23.939031" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:23.939016" elapsed="0.000252"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:23.937223" elapsed="0.002069"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:23.936960" elapsed="0.002359"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:00:23.934234" elapsed="0.005196">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:24.943276" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:24.942485" elapsed="0.000843"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:24.943440" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T01:00:24.943670" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:24.941657" elapsed="0.002048"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:24.944631" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:24.943923" elapsed="0.001200">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:24.945432" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:24.946002" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:24.946267" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:24.946545" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:24.946804" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:24.947076" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:24.947338" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:24.947721" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:24.947490" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:24.947464" elapsed="0.000369"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:24.948130" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:24.947907" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:24.947885" elapsed="0.000361"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:24.948560" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:24.948318" elapsed="0.000398"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:24.948297" elapsed="0.000454"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:24.945784" elapsed="0.002998"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:24.945534" elapsed="0.003283"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:00:24.940654" elapsed="0.008296">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:25.953574" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:25.952710" elapsed="0.000937"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:25.953765" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:00:25.954122" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:25.951859" elapsed="0.002354"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:25.955238" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:25.954653" elapsed="0.001435">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:25.956606" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:25.957705" elapsed="0.000063"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:25.958216" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:25.958759" elapsed="0.000054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:25.959215" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:25.959689" elapsed="0.000049"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:25.960135" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:25.960763" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:25.960343" elapsed="0.000550"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:25.960299" elapsed="0.000653"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:25.961583" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:25.961078" elapsed="0.000680"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:25.961042" elapsed="0.000791"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:25.962422" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:25.962057" elapsed="0.000446"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:25.961999" elapsed="0.000537"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:25.957216" elapsed="0.005353"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:25.956777" elapsed="0.005829"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:00:25.950704" elapsed="0.012077">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:26.967130" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:26.966334" elapsed="0.000878"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:26.967341" elapsed="0.000126"/>
</return>
<msg time="2026-04-11T01:00:26.967754" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:26.965434" elapsed="0.002376"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:26.968753" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:26.968165" elapsed="0.001503">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:26.970144" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:26.971199" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:26.971491" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:26.971853" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:26.972117" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:26.972401" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:26.972667" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:26.973027" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:26.972795" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:26.972768" elapsed="0.000369"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:26.973478" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:26.973213" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:26.973190" elapsed="0.000400"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:26.973885" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:26.973664" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:26.973643" elapsed="0.000350"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:26.970973" elapsed="0.003051"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:26.970305" elapsed="0.003757"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:00:26.964326" elapsed="0.009868">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:27.978540" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:27.977735" elapsed="0.000877"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:27.978735" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:00:27.979095" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:27.976842" elapsed="0.002309"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:27.980105" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:27.979535" elapsed="0.001491">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:27.981573" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:27.982549" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:27.982990" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:27.983434" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:27.983850" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:27.984414" elapsed="0.000051"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:27.984844" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:27.985407" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:27.985044" elapsed="0.000419"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:27.985003" elapsed="0.000485"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:27.985701" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:27.985542" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:27.985527" elapsed="0.000251"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:27.985987" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:27.985829" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:27.985814" elapsed="0.000248"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:27.982161" elapsed="0.003924"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:27.981734" elapsed="0.004378"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:00:27.975653" elapsed="0.010622">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:28.990161" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:28.989413" elapsed="0.000819"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:28.990351" elapsed="0.000110"/>
</return>
<msg time="2026-04-11T01:00:28.990764" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:28.988583" elapsed="0.002237"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:28.991753" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:28.991176" elapsed="0.001364">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:28.993002" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:28.993962" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:28.994451" elapsed="0.000461"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:28.995304" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:28.995577" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:28.995765" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:28.995952" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:28.996211" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:28.996045" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:28.996025" elapsed="0.000266"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:28.996524" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:28.996346" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:28.996330" elapsed="0.000274"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:28.996820" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:28.996657" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:28.996641" elapsed="0.000258"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:28.993613" elapsed="0.003309"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:28.993159" elapsed="0.003789"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:00:28.987547" elapsed="0.009496">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:30.001464" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:30.000617" elapsed="0.000924"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:30.001663" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:00:30.002020" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:29.999715" elapsed="0.002363"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:30.003027" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:30.002470" elapsed="0.001450">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:30.004439" elapsed="0.000041"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:30.005035" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:30.005299" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:30.005584" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:30.005979" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:30.006244" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:30.006564" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:30.006939" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:30.006704" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:30.006675" elapsed="0.000377"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:30.007401" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:30.007128" elapsed="0.000360"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:30.007105" elapsed="0.000421"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:30.007831" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:30.007606" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:30.007583" elapsed="0.000358"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:30.004812" elapsed="0.003163"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:30.004559" elapsed="0.003456"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:00:29.998590" elapsed="0.009562">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.012241" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:31.011435" elapsed="0.000882"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:31.012497" elapsed="0.000105"/>
</return>
<msg time="2026-04-11T01:00:31.012923" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:31.010546" elapsed="0.002436"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:31.013962" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.013342" elapsed="0.001460">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.015263" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.016203" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.016656" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.017067" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.017510" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.017923" elapsed="0.000043"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.018328" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.019452" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.019046" elapsed="0.000556"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:31.019003" elapsed="0.000654"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.020131" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.019774" elapsed="0.000475"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:31.019740" elapsed="0.000561"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.020859" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.020488" elapsed="0.000495"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:31.020380" elapsed="0.000655"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:00:31.015856" elapsed="0.005230"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.015454" elapsed="0.005689"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.009475" elapsed="0.011874">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T01:00:31.021602" level="FAIL">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Linear Topology On Member</arg>
<arg>${SWITCHES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:00:20.901787" elapsed="10.120136">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Linear Topology.</doc>
<status status="FAIL" start="2026-04-11T01:00:20.889473" elapsed="10.132786">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t42" name="Add Flows And Groups After Mininet Reconnects" line="301">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:00:31.030698" elapsed="0.000554"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:00:31.030035" elapsed="0.001377"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.033807" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:00:31.033524" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:31.033410" elapsed="0.000556"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.039999" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:00:31.039890" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:31.039871" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.041107" 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-11T01:00:31.040706" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.041606" 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-11T01:00:31.041300" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:00:31.041676" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T01:00:31.041842" 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-11T01:00:31.040305" elapsed="0.001562"/>
</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-11T01:00:31.042250" 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-11T01:00:31.042524" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.042349" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:31.042332" elapsed="0.000268"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:00:31.042090" elapsed="0.000533"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.041928" elapsed="0.000723"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:00:31.039519" elapsed="0.003186"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:00:31.032776" elapsed="0.009984"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:00:31.031768" elapsed="0.011036"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:00:31.023871" elapsed="0.018988"/>
</kw>
<kw name="Add Single Group And Flow On Member">
<kw name="Add Groups And Flows On Member">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.044436" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:31.044125" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:31.044509" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:00:31.044655" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:31.043780" elapsed="0.000900"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.047774" level="INFO">&amp;{mapping} = { NODE=openflow:1 }</msg>
<var>&amp;{mapping}</var>
<arg>NODE=openflow:${switch}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T01:00:31.047352" elapsed="0.000451"/>
</kw>
<kw name="Post_As_Json_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.090252" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:31.089854" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T01:00:31.091318" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.090928" elapsed="0.000497">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-11T01:00:31.091523" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T01:00:31.090586" elapsed="0.000962"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.092099" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T01:00:31.091716" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-11T01:00:31.092465" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-11T01:00:31.092636" level="INFO">${template} = /rests/data/opendaylight-inventory:nodes/node=$NODE
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-11T01:00:31.092290" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.093071" level="INFO">/rests/data/opendaylight-inventory:nodes/node=$NODE
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:00:31.092824" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.094320" level="INFO">mapping: {'NODE': 'openflow:1'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:00:31.093862" elapsed="0.000504"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.094961" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-11T01:00:31.094545" elapsed="0.000443"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.096043" level="INFO">${value} = openflow:1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-11T01:00:31.095404" elapsed="0.000681"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-11T01:00:31.097916" level="INFO">${encoded} = openflow%3A1</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-11T01:00:31.097533" elapsed="0.000416"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-11T01:00:31.098032" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T01:00:31.098375" level="INFO">${encoded_value} = openflow%3A1</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-11T01:00:31.096570" elapsed="0.001862"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:00:31.098661" elapsed="0.000537"/>
</kw>
<var name="${key}">NODE</var>
<var name="${value}">openflow:1</var>
<status status="PASS" start="2026-04-11T01:00:31.095218" elapsed="0.004077"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-11T01:00:31.095043" elapsed="0.004291"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-11T01:00:31.099378" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T01:00:31.099554" level="INFO">${mapping_to_use} = {'NODE': 'openflow%3A1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-11T01:00:31.093541" elapsed="0.006038"/>
</kw>
<status status="PASS" start="2026-04-11T01:00:31.093199" elapsed="0.006412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.099789" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.099637" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:31.093173" elapsed="0.006692"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.100610" level="INFO">${final_text} = /rests/data/opendaylight-inventory:nodes/node=openflow%3A1</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:00:31.100013" elapsed="0.000625"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T01:00:31.100688" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="PASS" start="2026-04-11T01:00:31.089159" elapsed="0.011651"/>
</kw>
<msg time="2026-04-11T01:00:31.100864" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T01:00:31.076729" elapsed="0.024185"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.113224" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.125274" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.137468" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.137667" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.137845" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.138206" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.138061" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:31.138046" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.138441" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.138613" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.138781" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-11T01:00:31.138018" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.137919" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.139005" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.139080" elapsed="0.000015"/>
</return>
<msg time="2026-04-11T01:00:31.139194" level="INFO">${uri} = /rests/data/opendaylight-inventory:nodes/node=openflow%3A1</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one 1 times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-11T01:00:31.072529" elapsed="0.066690"/>
</kw>
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T01:00:31.149826" elapsed="0.000329"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.163344" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/post_data.prolog.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:31.162958" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T01:00:31.164102" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/post_data.prolog.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.163883" elapsed="0.000325">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/post_data.prolog.json' does not exist.</status>
</kw>
<msg time="2026-04-11T01:00:31.164304" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T01:00:31.163552" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.164926" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/post_data.prolog.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T01:00:31.164543" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-11T01:00:31.165249" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/post_data.prolog.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/post_data.prolog.json&lt;/a&gt;'.</msg>
<msg time="2026-04-11T01:00:31.165394" level="INFO">${template} = {
  "flow-node-inventory:group": [
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-11T01:00:31.165114" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.165819" level="INFO">{
  "flow-node-inventory:group": [
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:00:31.165578" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-11T01:00:31.166224" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.165930" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.166762" level="INFO">${mapping_to_use} = {'NODE': 'openflow:1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:31.166471" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-11T01:00:31.166312" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:31.165911" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.167632" level="INFO">${final_text} = {
  "flow-node-inventory:group": [</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:00:31.166991" elapsed="0.000668"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T01:00:31.167709" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T01:00:31.167873" level="INFO">${prolog} = {
  "flow-node-inventory:group": [</msg>
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="PASS" start="2026-04-11T01:00:31.162338" elapsed="0.005560"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.181262" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/post_data.epilog.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:31.180875" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T01:00:31.182023" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/post_data.epilog.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.181809" elapsed="0.000288">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/post_data.epilog.json' does not exist.</status>
</kw>
<msg time="2026-04-11T01:00:31.182191" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T01:00:31.181472" elapsed="0.000743"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.182798" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/post_data.epilog.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T01:00:31.182395" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-11T01:00:31.183138" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/post_data.epilog.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/post_data.epilog.json&lt;/a&gt;'.</msg>
<msg time="2026-04-11T01:00:31.183265" level="INFO">${template} =   ]
}
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-11T01:00:31.182989" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.183710" level="INFO">  ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:00:31.183465" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-11T01:00:31.184186" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.183859" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.184746" level="INFO">${mapping_to_use} = {'NODE': 'openflow:1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:31.184445" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-11T01:00:31.184273" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:31.183839" elapsed="0.000991"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.185435" level="INFO">${final_text} =   ]
}</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:00:31.184977" elapsed="0.000486"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T01:00:31.185513" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T01:00:31.185670" level="INFO">${epilog} =   ]
}</msg>
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="PASS" start="2026-04-11T01:00:31.180207" elapsed="0.005488"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.199281" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/data.item.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:31.198913" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T01:00:31.200058" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/data.item.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.199848" elapsed="0.000273">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1.vanadium/data.item.json' does not exist.</status>
</kw>
<msg time="2026-04-11T01:00:31.200213" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T01:00:31.199487" elapsed="0.000750"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.200796" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/data.item.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T01:00:31.200419" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-11T01:00:31.201114" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/data.item.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/data.item.json&lt;/a&gt;'.</msg>
<msg time="2026-04-11T01:00:31.201238" level="INFO">${template} =         {
          "group-id": ${i}000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
       ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-11T01:00:31.200983" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.201678" level="INFO">        {
          "group-id": ${i}000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-${i}",
          "group-type": "group-select"
        }
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:00:31.201437" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-11T01:00:31.202076" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.201792" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.202607" level="INFO">${mapping_to_use} = {'NODE': 'openflow:1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:31.202302" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-11T01:00:31.202158" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:31.201773" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.203437" level="INFO">${final_text} =         {
          "group-id": ${i}000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
       ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:00:31.202838" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T01:00:31.203514" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T01:00:31.203671" level="INFO">${item_template} =         {
          "group-id": ${i}000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
       ...</msg>
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/${file_name}.</doc>
<status status="PASS" start="2026-04-11T01:00:31.198360" elapsed="0.005379"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.204149" level="INFO">${items} = []</msg>
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T01:00:31.203906" elapsed="0.000269"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.204724" level="INFO">${separator} = ,
</msg>
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T01:00:31.204334" elapsed="0.000415"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.205562" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.205304" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:31.205289" elapsed="0.000355"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.206134" level="INFO">${j} = 1</msg>
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:00:31.205786" elapsed="0.000375"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.206941" level="INFO">${item} =         {
          "group-id": 1000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
          ...</msg>
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:00:31.206317" elapsed="0.000652"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-11T01:00:31.207127" elapsed="0.000198"/>
</kw>
<var name="${iteration}">1</var>
<status status="PASS" start="2026-04-11T01:00:31.205255" elapsed="0.002108"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="PASS" start="2026-04-11T01:00:31.204806" elapsed="0.002604"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.208009" level="INFO">${final_text} = {
  "flow-node-inventory:group": [
        {
          "group-id": 1000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
   ...</msg>
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-11T01:00:31.207564" elapsed="0.000475"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-11T01:00:31.208096" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:00:31.208246" level="INFO">${data} = {
  "flow-node-inventory:group": [
        {
          "group-id": 1000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
   ...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>name_prefix=post_</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one 1 times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-11T01:00:31.148969" elapsed="0.059303"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-11T01:00:31.209537" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.209287" elapsed="0.000319">File '/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/variables/openflowplugin/add-group-1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-11T01:00:31.209696" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T01:00:31.208958" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.210035" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.209790" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.210603" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:31.210301" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-11T01:00:31.210115" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:31.209772" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.213004" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T01:00:31.210846" elapsed="0.002185"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-11T01:00:31.213080" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:00:31.213230" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Clustered_Reconciliation/../../../variables/openflowplugin/add-group-1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-11T01:00:31.208637" elapsed="0.004651"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.214821" level="INFO">/rests/data/opendaylight-inventory:nodes/node=openflow%3A1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:00:31.214580" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.215251" level="INFO">{
  "flow-node-inventory:group": [
        {
          "group-id": 1000,
          "buckets": {
            "bucket": [
              {
                "bucket-id": 1,
                "weight": 1,
                "action": [
                  {
                    "order": 1,
                    "output-action": {
                      "output-node-connector": "1"
                    }
                  }
                ]
              }
            ]
          },
          "group-name": "Select-1",
          "group-type": "group-select"
        }
  ]
}</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:00:31.215018" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.215720" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:00:31.215463" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.216146" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:00:31.215913" elapsed="0.000276"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-11T01:00:31.217009" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-11T01:00:31.216813" elapsed="0.000222"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-11T01:00:31.217359" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-11T01:00:31.217189" elapsed="0.000210"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:00:31.217552" elapsed="0.000190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.218141" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:00:31.217899" elapsed="0.000286"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-11T01:00:31.218226" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:00:31.218378" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-11T01:00:31.216404" elapsed="0.002015"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:31.220980" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.220689" elapsed="0.000663">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<status status="FAIL" start="2026-04-11T01:00:31.218489" elapsed="0.002969">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.221641" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.221490" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-11T01:00:31.218472" elapsed="0.003258">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.222094" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.222224" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:00:31.222189" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:31.222172" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.222443" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.222510" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.213640" elapsed="0.008976">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.222694" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=json</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.061742" elapsed="0.161045">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.223116" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.222939" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:31.222922" elapsed="0.000284"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.223238" elapsed="0.000014"/>
</return>
<arg>folder=${VAR_DIR}/add-group-1</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>iterations=${iter}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.059083" elapsed="0.164249">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Post_As_Json_Templated" owner="TemplatedRequests">
<arg>folder=${VAR_DIR}/add-group-2</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>iterations=${iter}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.234563" elapsed="0.000030"/>
</kw>
<kw name="Post_As_Json_Templated" owner="TemplatedRequests">
<arg>folder=${VAR_DIR}/add-flow</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>iterations=${iter}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.249543" elapsed="0.000050"/>
</kw>
<var name="${switch}">1</var>
<status status="FAIL" start="2026-04-11T01:00:31.047202" elapsed="0.202499">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="FAIL" start="2026-04-11T01:00:31.044728" elapsed="0.205074">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</for>
<arg>1</arg>
<arg>${member_index}</arg>
<doc>Add 100 groups type 1 &amp; 2 and flows in every switch.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.043341" elapsed="0.206631">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Add 1 group 1&amp;2 and 1 flow in every switch.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.043000" elapsed="0.207124">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Add 1 group type 1&amp;2 and 1 flow in every switch.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.022937" elapsed="0.227425">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t43" name="Check Flows In Operational DS After Mininet Reconnects" line="305">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:00:31.255147" elapsed="0.000394"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:00:31.254721" elapsed="0.000905"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.257131" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:00:31.256952" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:31.256919" elapsed="0.000325"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.264441" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:00:31.264268" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-11T01:00:31.264241" elapsed="0.000309"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.266026" 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-11T01:00:31.265464" elapsed="0.000603"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.266766" 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-11T01:00:31.266307" elapsed="0.000499"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:00:31.266872" elapsed="0.000047"/>
</return>
<msg time="2026-04-11T01:00:31.267114" 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-11T01:00:31.264895" elapsed="0.002257"/>
</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-11T01:00:31.267723" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.268111" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:00:31.267880" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:00:31.267851" elapsed="0.000470"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:00:31.267497" elapsed="0.000871"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:00:31.267238" elapsed="0.001207"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:00:31.263764" elapsed="0.004775"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:00:31.256533" elapsed="0.012100"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:00:31.255860" elapsed="0.012845"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:00:31.251574" elapsed="0.017213"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:31.271533" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:31.271057" elapsed="0.000516"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:31.271640" elapsed="0.000048"/>
</return>
<msg time="2026-04-11T01:00:31.271866" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:31.270499" elapsed="0.001403"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:31.272530" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.272133" elapsed="0.000973">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.273435" elapsed="0.000036"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.273708" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:31.273969" elapsed="0.000028"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.269902" elapsed="0.004227">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:32.277958" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:32.277109" elapsed="0.000921"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:32.278154" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:00:32.278586" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:32.276182" elapsed="0.002465"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:32.279676" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:32.279047" elapsed="0.001493">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:32.281020" elapsed="0.000055"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:32.281532" elapsed="0.000054"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:32.281991" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:32.275069" elapsed="0.007174">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:33.286452" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:33.285679" elapsed="0.000847"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:33.286643" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:00:33.286997" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:33.284266" elapsed="0.002788"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:33.287983" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:33.287436" elapsed="0.001341">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:33.289238" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:33.289693" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:33.290253" elapsed="0.000048"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:33.283188" elapsed="0.007351">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:34.293994" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:34.293425" elapsed="0.000614"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:34.294116" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T01:00:34.294343" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:34.292515" elapsed="0.001865"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:34.294970" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:34.294624" elapsed="0.000861">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:34.295787" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:34.296054" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:34.296324" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:34.291481" elapsed="0.005030">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:35.300072" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:35.299276" elapsed="0.000865"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:35.300256" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:00:35.300652" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:35.298485" elapsed="0.002228"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:35.301632" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:35.301060" elapsed="0.001310">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:35.302862" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:35.303286" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:35.303782" elapsed="0.000059"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:35.297456" elapsed="0.006599">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:36.307592" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:36.306816" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:36.307774" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:00:36.308119" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:36.306001" elapsed="0.002172"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:36.312501" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:36.308546" elapsed="0.004701">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:36.313759" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:36.314183" elapsed="0.000044"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:36.314642" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:36.304973" elapsed="0.009917">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:37.318913" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:37.318081" elapsed="0.000900"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:37.319239" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:00:37.319635" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:37.317190" elapsed="0.002501"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:37.320695" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:37.320103" elapsed="0.001311">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:37.321710" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:37.321972" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:37.322243" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:37.316093" elapsed="0.006325">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:38.326259" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:38.325466" elapsed="0.000867"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:38.326491" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:00:38.326874" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:38.324565" elapsed="0.002368"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:38.327956" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:38.327339" elapsed="0.001453">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:38.329282" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:38.329795" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:38.330067" elapsed="0.000027"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:38.323353" elapsed="0.006874">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:39.334472" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:39.333622" elapsed="0.000927"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:39.334678" elapsed="0.000090"/>
</return>
<msg time="2026-04-11T01:00:39.335063" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:39.332290" elapsed="0.002832"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:39.336154" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:39.335527" elapsed="0.001529">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:39.337559" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:39.337992" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:39.338456" elapsed="0.000049"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:39.331139" elapsed="0.007577">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:40.343136" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:40.342299" elapsed="0.000910"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:40.343330" elapsed="0.000114"/>
</return>
<msg time="2026-04-11T01:00:40.343744" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:40.341501" elapsed="0.002304"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:40.344799" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:40.344186" elapsed="0.001442">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:40.346227" elapsed="0.000054"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:40.346788" elapsed="0.000061"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:40.347102" elapsed="0.000021"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:40.339708" elapsed="0.007511">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:41.350922" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:41.350136" elapsed="0.000854"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:41.351111" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:00:41.351506" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:41.349273" elapsed="0.002290"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:41.352497" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:41.351915" elapsed="0.001354">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:41.353766" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:41.354243" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:41.354710" elapsed="0.000046"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:41.348223" elapsed="0.006714">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:42.358622" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:42.357811" elapsed="0.000881"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:42.358808" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:00:42.359166" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:42.356972" elapsed="0.002251"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:42.360147" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:42.359605" elapsed="0.001314">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:42.361374" elapsed="0.000082"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:42.361835" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:42.362319" elapsed="0.000046"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:42.355893" elapsed="0.006713">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:43.366128" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:43.365359" elapsed="0.000839"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:43.366315" elapsed="0.000108"/>
</return>
<msg time="2026-04-11T01:00:43.366729" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:43.364562" elapsed="0.002224"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:43.368262" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:43.367137" elapsed="0.001891">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:43.369527" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:43.369954" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:43.370481" elapsed="0.000111"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:43.363528" elapsed="0.007397">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:44.374590" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:44.373821" elapsed="0.000837"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:44.374774" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:00:44.375126" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:44.372924" elapsed="0.002257"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:44.376191" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:44.375622" elapsed="0.001094">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:44.377009" elapsed="0.000030"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:44.377275" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:44.377570" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:44.371877" elapsed="0.005854">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:45.380356" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:45.379844" elapsed="0.000580"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:45.380508" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:00:45.380771" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:45.379275" elapsed="0.001532"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:45.381410" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:45.381035" elapsed="0.000899">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:45.382261" elapsed="0.000034"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:45.382561" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:45.382891" elapsed="0.000040"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:45.378514" elapsed="0.004593">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:46.386805" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:46.385993" elapsed="0.000880"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:46.386993" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:00:46.387350" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:46.385164" elapsed="0.002275"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:46.388369" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:46.387795" elapsed="0.001357">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:46.389643" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:46.390095" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:46.390571" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:46.384054" elapsed="0.006773">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:47.395161" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:47.394417" elapsed="0.000811"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:47.395344" elapsed="0.000105"/>
</return>
<msg time="2026-04-11T01:00:47.395750" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:47.393590" elapsed="0.002333"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:47.396860" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:47.396285" elapsed="0.001349">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:47.398091" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:47.398552" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:47.398996" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:47.391899" elapsed="0.007350">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:48.403193" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:48.402349" elapsed="0.000920"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:48.403430" elapsed="0.000096"/>
</return>
<msg time="2026-04-11T01:00:48.403816" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:48.401487" elapsed="0.002384"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:48.404818" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:48.404227" elapsed="0.001449">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:48.406187" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:48.406481" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:48.406764" elapsed="0.000028"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:48.400275" elapsed="0.006657">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:49.410882" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:49.410047" elapsed="0.000905"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:49.411081" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:00:49.411529" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:49.409187" elapsed="0.002407"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:49.412572" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:49.411974" elapsed="0.001390">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:49.413865" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:49.414289" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:49.414759" elapsed="0.000048"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:49.407959" elapsed="0.007058">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:50.419202" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:50.417838" elapsed="0.001433"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:50.419423" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:00:50.419784" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:50.417017" elapsed="0.002824"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:50.420775" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:50.420196" elapsed="0.001362">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:50.422017" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:50.422640" elapsed="0.000051"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:50.423083" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:50.415995" elapsed="0.007366">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:51.427087" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:51.426296" elapsed="0.000864"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:51.427284" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:00:51.427682" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:51.425489" elapsed="0.002249"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:51.428784" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:51.428091" elapsed="0.001452">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:51.429844" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:51.430111" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:51.430406" elapsed="0.000031"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:51.424328" elapsed="0.006240">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:52.436525" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:52.435680" elapsed="0.001066"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:52.436879" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:00:52.437483" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:52.433532" elapsed="0.004204"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:52.439647" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:52.438777" elapsed="0.002348">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:52.441455" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:52.442039" elapsed="0.000038"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:52.442607" elapsed="0.000042"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:52.432230" elapsed="0.011038">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:53.445949" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:53.445426" elapsed="0.000606"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:53.446117" elapsed="0.000067"/>
</return>
<msg time="2026-04-11T01:00:53.446403" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:53.444825" elapsed="0.001617"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:53.447222" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:53.446677" elapsed="0.001178">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:53.448183" elapsed="0.000033"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:53.448492" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:53.448783" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:53.443996" elapsed="0.004954">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:54.453499" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:54.452639" elapsed="0.000943"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:54.453703" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:00:54.454062" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:54.451812" elapsed="0.002305"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:54.455294" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:54.454519" elapsed="0.001564">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:54.456656" elapsed="0.000061"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:54.457129" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:54.457600" elapsed="0.000046"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:54.450626" elapsed="0.007250">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:55.462031" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:55.461120" elapsed="0.001001"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:55.462271" elapsed="0.000094"/>
</return>
<msg time="2026-04-11T01:00:55.462719" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:55.460161" elapsed="0.002614"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:55.463823" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:55.463131" elapsed="0.001604">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:55.465212" elapsed="0.000056"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:55.465820" elapsed="0.000033"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:55.466100" elapsed="0.000030"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:55.458980" elapsed="0.007283">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:56.470091" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:56.469272" elapsed="0.000890"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:56.470284" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:00:56.470695" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:56.468375" elapsed="0.002381"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:56.471742" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:56.471135" elapsed="0.001446">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:56.473072" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:56.473558" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:56.474027" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:56.467205" elapsed="0.007085">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:57.478972" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:57.478069" elapsed="0.000973"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:57.479163" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:00:57.479574" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:57.476525" elapsed="0.003133"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:57.480898" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:57.480237" elapsed="0.001511">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:57.482268" elapsed="0.000059"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:57.482803" elapsed="0.000090"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:57.483317" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:57.475239" elapsed="0.008459">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:58.487939" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:58.487023" elapsed="0.000988"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:58.488162" elapsed="0.000090"/>
</return>
<msg time="2026-04-11T01:00:58.488589" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:58.486034" elapsed="0.002634"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:58.489819" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:58.489072" elapsed="0.001665">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:58.491447" elapsed="0.000061"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:58.491752" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:58.492023" elapsed="0.000028"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:58.484812" elapsed="0.007373">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:00:59.496046" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:00:59.495223" elapsed="0.000896"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:00:59.496242" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:00:59.496660" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:00:59.494301" elapsed="0.002420"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:00:59.497932" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:00:59.497100" elapsed="0.001703">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:59.499304" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:59.499825" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:00:59.500287" elapsed="0.000049"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:00:59.493180" elapsed="0.007410">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:00.504293" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:00.503553" elapsed="0.000808"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:00.504515" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:01:00.504871" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:00.502720" elapsed="0.002208"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:00.505856" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:00.505279" elapsed="0.001938">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:00.507713" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:00.508143" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:00.508766" elapsed="0.000050"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:00.501597" elapsed="0.007434">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:01.512655" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:01.511885" elapsed="0.000838"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:01.512839" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:01:01.513192" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:01.511058" elapsed="0.002191"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:01.514229" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:01.513634" elapsed="0.001249">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:01.515184" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:01.515475" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:01.515754" elapsed="0.000028"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:01.510030" elapsed="0.005883">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T01:01:01.516032" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Flows On Member</arg>
<arg>${all_flows}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.269048" elapsed="30.247110">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Flows in Operational DS.</doc>
<status status="FAIL" start="2026-04-11T01:00:31.250745" elapsed="30.265626">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t44" name="Check Groups In Operational DS After Mininet Reconnects" line="309">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:01:01.521046" elapsed="0.000300"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:01:01.520671" elapsed="0.000795"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:01.523085" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:01.522913" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:01.522883" elapsed="0.000300"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:01.529214" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:01.529107" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:01.529088" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:01.530300" 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-11T01:01:01.529917" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:01.530789" 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-11T01:01:01.530504" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:01.530859" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:01:01.531011" 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-11T01:01:01.529527" elapsed="0.001508"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:01.531410" 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-11T01:01:01.531658" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:01:01.531510" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:01:01.531493" elapsed="0.000243"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:01:01.531249" elapsed="0.000510"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:01.531092" elapsed="0.000694"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:01:01.528744" elapsed="0.003097"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:01:01.522447" elapsed="0.009511"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:01.521763" elapsed="0.010241"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:01:01.517500" elapsed="0.014555"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:01.533810" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:01.533501" elapsed="0.000335"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:01.533883" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:01:01.534030" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:01.533143" elapsed="0.000912"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:01.534459" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:01.534210" elapsed="0.000562">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:01.534971" elapsed="0.000022"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:01.535160" elapsed="0.000020"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:01.535355" elapsed="0.000020"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:01.532770" elapsed="0.002714">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:02.539143" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:02.538370" elapsed="0.000840"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:02.539325" elapsed="0.000107"/>
</return>
<msg time="2026-04-11T01:01:02.539714" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:02.537573" elapsed="0.002197"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:02.540693" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:02.540120" elapsed="0.001442">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:02.542032" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:02.542490" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:02.542935" elapsed="0.000045"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:02.536448" elapsed="0.006739">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:03.547605" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:03.546823" elapsed="0.000850"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:03.547795" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:01:03.548153" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:03.545325" elapsed="0.002886"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:03.549284" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:03.548620" elapsed="0.001525">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:03.550683" elapsed="0.000070"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:03.551227" elapsed="0.000052"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:03.551754" elapsed="0.000051"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:03.544189" elapsed="0.007831">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:04.555968" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:04.555086" elapsed="0.000956"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:04.556163" elapsed="0.000128"/>
</return>
<msg time="2026-04-11T01:01:04.556630" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:04.554217" elapsed="0.002472"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:04.557671" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:04.557046" elapsed="0.001403">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:04.558911" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:04.559371" elapsed="0.000101"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:04.559946" elapsed="0.000053"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:04.553136" elapsed="0.007080">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:05.564000" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:05.563075" elapsed="0.000998"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:05.564201" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:01:05.564608" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:05.562242" elapsed="0.002425"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:05.565613" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:05.565027" elapsed="0.001452">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:05.566983" elapsed="0.000056"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:05.567447" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:05.567932" elapsed="0.000046"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:05.561188" elapsed="0.007000">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:06.571866" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:06.571049" elapsed="0.000883"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:06.572049" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:01:06.572435" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:06.570214" elapsed="0.002282"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:06.573971" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:06.572850" elapsed="0.001902">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:06.575221" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:06.575731" elapsed="0.000052"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:06.576186" elapsed="0.000044"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:06.569133" elapsed="0.007334">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:07.580180" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:07.579424" elapsed="0.000825"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:07.580368" elapsed="0.000110"/>
</return>
<msg time="2026-04-11T01:01:07.580759" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:07.578551" elapsed="0.002264"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:07.581918" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:07.581323" elapsed="0.001373">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:07.583190" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:07.583656" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:07.584100" elapsed="0.000045"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:07.577482" elapsed="0.006871">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:08.588128" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:08.587333" elapsed="0.000866"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:08.588321" elapsed="0.000110"/>
</return>
<msg time="2026-04-11T01:01:08.588721" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:08.586477" elapsed="0.002302"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:08.589719" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:08.589135" elapsed="0.001387">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:08.590988" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:08.591443" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:08.591885" elapsed="0.000045"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:08.585320" elapsed="0.006819">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:09.594641" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:09.594153" elapsed="0.000532"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:09.594756" elapsed="0.000052"/>
</return>
<msg time="2026-04-11T01:01:09.594971" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:09.593636" elapsed="0.001367"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:09.595743" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:09.595419" elapsed="0.000819">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:09.596543" elapsed="0.000030"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:09.596807" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:09.597067" elapsed="0.000027"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:09.592922" elapsed="0.004306">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:10.601649" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:10.600831" elapsed="0.000921"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:10.601901" elapsed="0.000099"/>
</return>
<msg time="2026-04-11T01:01:10.602325" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:10.600003" elapsed="0.002413"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:10.603319" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:10.602774" elapsed="0.001328">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:10.604629" elapsed="0.000056"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:10.605060" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:10.605690" elapsed="0.000050"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:10.598970" elapsed="0.006983">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.609615" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:11.608810" elapsed="0.000873"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:01:11.609800" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:01:11.610156" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:01:11.607987" elapsed="0.002224"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:01:11.611147" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.610599" elapsed="0.001326">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.612477" elapsed="0.000056"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.612935" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.613376" elapsed="0.000073"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.606924" elapsed="0.006734">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T01:01:11.613852" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Groups On Member</arg>
<arg>${all_groups}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:01:01.532220" elapsed="10.081833">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Groups in Operational DS.</doc>
<status status="FAIL" start="2026-04-11T01:01:01.516687" elapsed="10.097727">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t45" name="Check Flows In Switch After Mininet Reconnects" line="317">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:01:11.621905" elapsed="0.000333"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:01:11.621280" elapsed="0.001034"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.623748" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:11.623581" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:11.623552" elapsed="0.000291"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.630434" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:11.630308" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:11.630290" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.631515" 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-11T01:01:11.631114" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.631988" 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-11T01:01:11.631704" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:11.632057" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T01:01:11.632210" 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-11T01:01:11.630734" elapsed="0.001500"/>
</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-11T01:01:11.632612" 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-11T01:01:11.632853" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:01:11.632708" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:01:11.632691" elapsed="0.000276"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:01:11.632465" elapsed="0.000525"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.632292" elapsed="0.000782"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:01:11.629943" elapsed="0.003189"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:01:11.623157" elapsed="0.010028"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:11.622550" elapsed="0.010679"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:01:11.616262" elapsed="0.017018"/>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<msg time="2026-04-11T01:01:11.637519" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<arg>${all_flows}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-11T01:01:11.633559" elapsed="0.003999">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Check Flows in switch.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.615102" elapsed="0.022590">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s4-t46" name="Check Entity Owner Status And Find Owner and Successor Before Owner Stop" line="321">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:01:11.640859" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:01:11.640596" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.642116" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:11.642007" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:11.641988" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.647134" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:11.647027" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:11.647009" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.648185" 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-11T01:01:11.647813" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.648675" 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-11T01:01:11.648373" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:11.648746" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:01:11.648931" 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-11T01:01:11.647438" elapsed="0.001519"/>
</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-11T01:01:11.649299" 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-11T01:01:11.649558" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:01:11.649410" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:01:11.649378" elapsed="0.000255"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:01:11.649156" elapsed="0.000500"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.649010" elapsed="0.000671"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:01:11.646666" elapsed="0.003066"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:01:11.641723" elapsed="0.008063"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:11.641286" elapsed="0.008543"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:01:11.638499" elapsed="0.011380"/>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.685448" 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-11T01:01:11.685046" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.685927" 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-11T01:01:11.685641" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:11.686051" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T01:01:11.686212" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:11.684664" elapsed="0.001573"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:11.690872" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:11.690690" elapsed="0.000208"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:11.691051" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:11.691618" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:11.691411" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.692076" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:11.691821" elapsed="0.000295"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:11.692265" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:11.693022" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:11.692615" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.693493" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:11.693227" elapsed="0.000309"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.694034" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:11.693692" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.694487" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:11.694233" elapsed="0.000298"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.694971" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:11.694686" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:11.701582" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:11.710632" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.711411" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:11.711003" elapsed="0.000437"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:11.712570" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.712023" elapsed="0.000695">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.712893" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.711627" elapsed="0.001391">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.713196" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.713371" elapsed="0.000036"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.713568" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.713742" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.713912" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.714098" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.714268" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.714500" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.714670" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.714939" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.715166" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.715363" elapsed="0.000035"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:11.714806" elapsed="0.000655"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.714738" elapsed="0.000752"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.715638" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.715700" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.710107" elapsed="0.005704">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.715881" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.699263" elapsed="0.016719">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.716161" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.720585" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.720784" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.720864" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.690140" elapsed="0.030831">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:11.721084" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:11.721129" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:11.689591" elapsed="0.031561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.721350" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:11.721238" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:11.721218" elapsed="0.000233"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:11.722754" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.723431" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:11.723116" elapsed="0.000343"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:11.724242" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.723979" elapsed="0.000523">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.724568" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.723641" elapsed="0.001070">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.724928" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.725108" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.725286" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.725476" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.725650" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.725816" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.725983" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.726157" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.726324" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.726600" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.726774" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.726940" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:11.726468" elapsed="0.000525"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.726401" elapsed="0.000619"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.727162" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.727221" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.722195" elapsed="0.005130">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:11.727451" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:11.727495" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:11.721605" elapsed="0.005913"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:11.728126" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.727813" elapsed="0.000373">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:11.727598" elapsed="0.000650">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:11.727580" elapsed="0.000700">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.728325" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.689028" elapsed="0.039409">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.728617" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.728786" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.728859" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:11.686553" elapsed="0.042441">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.729172" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.729353" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.729544" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.729712" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.729883" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:11.730048" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:11.730109" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.684002" elapsed="0.046205">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:12.762879" 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-11T01:01:12.762407" elapsed="0.000506"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:12.763413" 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-11T01:01:12.763090" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:12.763491" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T01:01:12.763665" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:12.761989" elapsed="0.001701"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:12.768543" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:12.768311" elapsed="0.000260"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:12.768732" elapsed="0.000197"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:12.769304" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:12.769090" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:12.769807" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:12.769543" elapsed="0.000308"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:12.770005" elapsed="0.000186"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:12.770790" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:12.770349" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:12.771253" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:12.770997" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:12.771824" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:12.771472" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:12.772275" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:12.772027" elapsed="0.000404"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:12.772967" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:12.772595" elapsed="0.000404"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:12.779660" elapsed="0.000217"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:12.788747" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:12.789538" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:12.789125" elapsed="0.000441"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:12.790795" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:12.790165" elapsed="0.000789">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:12.791124" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:12.789761" elapsed="0.001488">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.791451" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.791634" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.791815" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.792020" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.792200" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.792401" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.792576" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.792751" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.792916" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.793201" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.793450" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.793653" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:12.793066" elapsed="0.000671"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:12.792991" elapsed="0.000778"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.793917" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:12.793977" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:12.788181" elapsed="0.005912">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:12.794162" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:12.777355" elapsed="0.016907">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.794514" elapsed="0.000024"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.798883" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.799084" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:12.799151" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:12.767748" elapsed="0.031511">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:12.799370" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:12.799452" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:12.767128" elapsed="0.032348"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:12.799680" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:12.799565" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:12.799544" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:12.801073" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:12.801755" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:12.801452" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:12.802725" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:12.802301" elapsed="0.000516">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:12.802880" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:12.801963" elapsed="0.001022">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.803164" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.803341" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.803536" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.803711" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.803880" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.804048" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.804216" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.804422" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.804589" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.804899" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.805081" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.805248" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:12.804754" elapsed="0.000584"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:12.804669" elapsed="0.000697"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.805532" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:12.805595" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:12.800530" elapsed="0.005172">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:12.805816" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:12.805861" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:12.799898" elapsed="0.005986"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:12.806527" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:12.806187" elapsed="0.000403">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:12.805967" elapsed="0.000689">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:12.805948" elapsed="0.000742">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:12.806737" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:12.766578" elapsed="0.040259">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.807022" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.807197" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:12.807261" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:12.763992" elapsed="0.043368">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.807553" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.807738" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.808205" elapsed="0.000029"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.808504" elapsed="0.000026"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.808690" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:12.808891" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:12.808958" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:12.761127" elapsed="0.047933">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:13.844703" 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-11T01:01:13.844212" elapsed="0.000526"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:13.845210" 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-11T01:01:13.844915" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:13.845285" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:01:13.845472" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:13.843797" elapsed="0.001701"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:13.850168" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:13.849975" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:13.850350" elapsed="0.000204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:13.851109" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:13.850711" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:13.851605" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:13.851331" elapsed="0.000316"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:13.851798" elapsed="0.000204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:13.852361" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:13.852158" elapsed="0.000243"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:13.852815" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:13.852574" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:13.853349" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:13.853011" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:13.853795" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:13.853561" elapsed="0.000277"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:13.854267" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:13.853989" elapsed="0.000303"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:13.860807" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:13.869739" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:13.870526" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:13.870104" elapsed="0.000449"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:13.871685" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:13.871138" elapsed="0.000712">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:13.872013" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:13.870742" elapsed="0.001397">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.872319" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.872515" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.872695" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.872866" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.873097" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.873265" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.873449" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.873625" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.873792" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.874067" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.874294" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.874519" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:13.873935" elapsed="0.000669"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:13.873864" elapsed="0.000768"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.874777" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:13.874837" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:13.869242" elapsed="0.005703">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:13.875013" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:13.858532" elapsed="0.016580">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.875290" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.879753" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.879962" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:13.880028" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:13.849436" elapsed="0.030696">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:13.880244" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:13.880287" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:13.848866" elapsed="0.031443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:13.880529" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:13.880410" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:13.880375" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:13.881892" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:13.882629" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:13.882291" elapsed="0.000364"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:13.883456" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:13.883178" elapsed="0.000368">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:13.883607" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:13.882840" elapsed="0.000870">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.883896" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.884083" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.884260" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.884448" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.884618" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.884783" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.884949" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.885120" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.885283" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.885555" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.885729" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.885892" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:13.885425" elapsed="0.000519"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:13.885346" elapsed="0.000624"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.886110" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:13.886168" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:13.881332" elapsed="0.004939">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:13.886394" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:13.886440" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:13.880745" elapsed="0.005718"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:13.887071" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:13.886758" elapsed="0.000373">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:13.886544" elapsed="0.000649">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:13.886525" elapsed="0.000700">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:13.887269" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:13.848299" elapsed="0.039066">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.887596" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.887766" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:13.887851" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:13.845802" elapsed="0.042149">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.888121" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.888300" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.888485" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.888649" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.888817" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:13.888981" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:13.889041" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:13.842990" elapsed="0.046147">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:14.925353" 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-11T01:01:14.924861" elapsed="0.000541"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:14.925872" 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-11T01:01:14.925580" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:14.925947" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T01:01:14.926119" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:14.924470" elapsed="0.001673"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:14.930942" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:14.930730" elapsed="0.000247"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:14.931137" elapsed="0.000262"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:14.931788" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:14.931570" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:14.932263" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:14.932004" elapsed="0.000300"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:14.932468" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:14.933007" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:14.932803" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:14.933538" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:14.933275" elapsed="0.000305"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:14.934072" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:14.933734" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:14.934515" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:14.934265" elapsed="0.000294"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:14.934989" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:14.934710" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:14.942344" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:14.954073" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:14.954840" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:14.954456" elapsed="0.000411"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:14.956031" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:14.955494" elapsed="0.000689">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:14.956344" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:14.955053" elapsed="0.001432">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.956660" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.956835" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.957009" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.957184" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.957348" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.957532" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.957697" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.957867" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.958029" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.958309" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.958556" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.958750" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:14.958176" elapsed="0.000655"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:14.958101" elapsed="0.000759"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.959021" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:14.959083" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:14.953585" elapsed="0.005605">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:14.959259" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:14.939435" elapsed="0.020008">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.959627" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.963935" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.964132" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:14.964198" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:14.930170" elapsed="0.034133">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:14.964430" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:14.964474" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:14.929614" elapsed="0.034883"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:14.964701" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:14.964585" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:14.964563" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:14.966080" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:14.966766" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:14.966465" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:14.967623" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:14.967337" elapsed="0.000374">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:14.967772" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:14.966980" elapsed="0.000894">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.968048" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.968220" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.968409" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.968583" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.968749" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.968912" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.969076" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.969278" elapsed="0.000182"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.969613" elapsed="0.000054"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.969909" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.970081" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.970244" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:14.969778" elapsed="0.000519"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:14.969715" elapsed="0.000607"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.970480" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:14.970541" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:14.965536" elapsed="0.005109">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:14.970755" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:14.970797" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:14.964927" elapsed="0.005893"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:14.971485" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:14.971115" elapsed="0.000431">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:14.970900" elapsed="0.000709">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:14.970882" elapsed="0.000759">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:14.971685" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:14.929038" elapsed="0.042745">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.971960" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.972127" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:14.972188" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:14.926473" elapsed="0.045812">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.972470" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.972649" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.972837" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.973010" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.973185" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:14.973348" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:14.973424" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:14.923669" elapsed="0.049888">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:16.008937" 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-11T01:01:16.008468" elapsed="0.000502"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:16.009464" 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-11T01:01:16.009143" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:16.009540" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T01:01:16.009709" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:16.008058" elapsed="0.001676"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:16.015789" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:16.015528" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:16.016039" elapsed="0.000265"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:16.016830" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:16.016540" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:16.017496" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:16.017125" elapsed="0.000430"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:16.017762" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:16.018757" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:16.018227" elapsed="0.000567"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:16.019344" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:16.019079" elapsed="0.000323"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:16.019899" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:16.019560" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:16.020332" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:16.020095" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:16.020825" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:16.020545" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:16.027432" elapsed="0.000214"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:16.036448" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:16.037202" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:16.036814" elapsed="0.000413"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:16.038364" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:16.037841" elapsed="0.000696">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:16.038701" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:16.037444" elapsed="0.001394">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.039018" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.039260" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.039458" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.039634" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.039803" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.039969" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.040135" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.040308" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.040487" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.040767" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.040994" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.041189" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:16.040633" elapsed="0.000636"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:16.040560" elapsed="0.000737"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.041458" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:16.041518" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:16.035943" elapsed="0.005682">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:16.041693" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:16.025120" elapsed="0.016672">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.041968" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.048221" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.048434" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:16.048502" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:16.014738" elapsed="0.033872">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:16.048723" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:16.048765" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:16.013950" elapsed="0.034838"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:16.049035" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:16.048911" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:16.048889" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:16.050434" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:16.051112" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:16.050808" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:16.051936" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:16.051675" elapsed="0.000349">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:16.052086" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:16.051320" elapsed="0.000869">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.052363" elapsed="0.000035"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.052554" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.052730" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.052901" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.053069" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.053233" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.053414" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.053587" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.053752" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.054009" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.054181" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.054343" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:16.053881" elapsed="0.000529"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:16.053816" elapsed="0.000621"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.054581" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:16.054640" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:16.049868" elapsed="0.004875">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:16.054882" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:16.054926" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:16.049254" elapsed="0.005695"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:16.055574" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:16.055244" elapsed="0.000390">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:16.055029" elapsed="0.000666">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:16.055011" elapsed="0.000749">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:16.055808" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:16.013163" elapsed="0.042741">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.056080" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.056248" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:16.056309" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:16.010032" elapsed="0.046389">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.056593" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.056772" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.056943" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.057106" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.057273" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:16.057452" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:16.057515" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:16.007247" elapsed="0.050366">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:17.089065" 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-11T01:01:17.088596" elapsed="0.000503"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:17.089584" 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-11T01:01:17.089273" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:17.089659" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:01:17.089829" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:17.088188" elapsed="0.001666"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:17.094555" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:17.094349" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:17.094737" elapsed="0.000202"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:17.095307" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:17.095096" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:17.095884" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:17.095625" elapsed="0.000302"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:17.096079" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:17.096656" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:17.096445" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:17.097101" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:17.096856" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:17.097667" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:17.097298" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:17.098103" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:17.097867" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:17.098625" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:17.098317" elapsed="0.000335"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:17.105405" elapsed="0.000218"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:17.114420" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:17.115166" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:17.114789" elapsed="0.000403"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:17.116329" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:17.115801" elapsed="0.000699">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:17.116662" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:17.115378" elapsed="0.001401">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.116959" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.117134" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.117311" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.117502" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.117673" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.117839" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.118006" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.118180" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.118363" elapsed="0.000034"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.118655" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.118880" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.119076" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:17.118521" elapsed="0.000636"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:17.118450" elapsed="0.000736"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.119331" elapsed="0.000072"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:17.119447" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:17.113888" elapsed="0.005668">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:17.119625" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:17.103085" elapsed="0.016640">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.119904" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.124242" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.124451" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:17.124520" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:17.093798" elapsed="0.030826">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:17.124735" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:17.124778" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:17.093229" elapsed="0.031572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:17.125003" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:17.124888" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:17.124867" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:17.126450" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:17.127122" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:17.126820" elapsed="0.000328"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:17.127954" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:17.127692" elapsed="0.000348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:17.128103" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:17.127335" elapsed="0.000870">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.128395" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.128573" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.128751" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.128923" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.129129" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.129298" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.129482" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.129659" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.129826" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.130084" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.130259" elapsed="0.000033"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.130460" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:17.129954" elapsed="0.000560"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:17.129891" elapsed="0.000649"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.130682" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:17.130740" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:17.125844" elapsed="0.005001">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:17.130955" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:17.130998" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:17.125220" elapsed="0.005801"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:17.131822" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:17.131316" elapsed="0.000566">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:17.131102" elapsed="0.000843">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:17.131084" elapsed="0.000893">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:17.132021" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:17.092684" elapsed="0.039432">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.132294" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.132480" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:17.132546" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:17.090155" elapsed="0.042490">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.132816" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.132999" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.133171" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.133372" elapsed="0.000036"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.133560" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:17.133728" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:17.133789" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:17.087423" elapsed="0.046465">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:18.166765" 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-11T01:01:18.166281" elapsed="0.000517"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:18.167270" 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-11T01:01:18.166974" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:18.167350" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T01:01:18.167536" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:18.165880" elapsed="0.001681"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:18.172333" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:18.172145" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:18.172534" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:18.173092" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:18.172883" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:18.173579" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:18.173310" elapsed="0.000311"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:18.173772" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:18.174324" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:18.174121" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:18.174779" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:18.174537" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:18.175309" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:18.174974" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:18.175756" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:18.175519" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:18.176233" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:18.175953" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:18.183071" elapsed="0.000215"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:18.192150" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:18.192917" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:18.192533" elapsed="0.000410"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:18.194179" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:18.193612" elapsed="0.000718">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:18.194510" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:18.193195" elapsed="0.001434">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.194805" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.194981" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.195159" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.195330" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.195515" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.195682" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.195851" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.196024" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.196189" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.196474" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.196705" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.196902" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:18.196328" elapsed="0.000655"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:18.196258" elapsed="0.000754"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.197159" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:18.197220" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:18.191657" elapsed="0.005671">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:18.197414" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:18.180749" elapsed="0.016767">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.197696" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.202015" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.202212" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:18.202319" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:18.171599" elapsed="0.030877">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:18.202590" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:18.202634" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:18.170985" elapsed="0.031672"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:18.202863" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:18.202742" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:18.202722" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:18.204262" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:18.204946" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:18.204644" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:18.205799" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:18.205508" elapsed="0.000379">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:18.205949" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:18.205153" elapsed="0.000898">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.206226" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.206423" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.206603" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.206772" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.206939" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.207105" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.207272" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.207457" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.207624" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.207880" elapsed="0.000166"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.208208" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.208392" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:18.207750" elapsed="0.000698"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:18.207688" elapsed="0.000786"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.208619" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:18.208678" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:18.203720" elapsed="0.005064">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:18.208894" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:18.208974" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:18.203083" elapsed="0.005916"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:18.209631" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:18.209298" elapsed="0.000393">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:18.209080" elapsed="0.000673">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:18.209062" elapsed="0.000745">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:18.209854" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:18.170433" elapsed="0.039518">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.210130" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.210299" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:18.210361" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:18.167860" elapsed="0.042617">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.210648" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.210828" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.211000" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.211164" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.211334" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:18.211516" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:18.211578" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:18.165043" elapsed="0.046633">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:19.249543" 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-11T01:01:19.249041" elapsed="0.000536"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:19.250050" 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-11T01:01:19.249753" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:19.250125" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T01:01:19.250294" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:19.248636" elapsed="0.001682"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:19.255130" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:19.254942" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:19.255317" elapsed="0.000205"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:19.255886" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:19.255679" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:19.256355" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:19.256100" elapsed="0.000313"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:19.256564" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:19.257106" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:19.256899" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:19.257578" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:19.257314" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:19.258303" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:19.257776" elapsed="0.000557"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:19.258770" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:19.258527" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:19.259256" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:19.258969" elapsed="0.000314"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:19.265930" elapsed="0.000215"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:19.274945" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:19.275727" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:19.275320" elapsed="0.000434"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:19.276898" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:19.276342" elapsed="0.000705">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:19.277207" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:19.275942" elapsed="0.001419">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.277561" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.277740" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.277921" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.278096" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.278267" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.278453" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.278626" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.278800" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.278968" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.279239" elapsed="0.000057"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.279522" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.279720" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:19.279106" elapsed="0.000695"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:19.279037" elapsed="0.000793"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.279976" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:19.280036" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:19.274452" elapsed="0.005691">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:19.280212" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:19.263591" elapsed="0.016722">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.280509" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.284822" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.285021" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:19.285087" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:19.254396" elapsed="0.030797">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:19.285315" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:19.285366" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:19.253824" elapsed="0.031616"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:19.285647" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:19.285529" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:19.285507" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:19.287125" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:19.287808" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:19.287508" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:19.288639" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:19.288358" elapsed="0.000366">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:19.288786" elapsed="0.000161"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:19.288018" elapsed="0.001020">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.289216" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.289477" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.289662" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.289836" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.290004" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.290171" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.290338" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.290529" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.290694" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.290953" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.291131" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.291293" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:19.290822" elapsed="0.000523"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:19.290759" elapsed="0.000612"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.291530" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:19.291590" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:19.286473" elapsed="0.005222">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:19.291806" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:19.291850" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:19.285868" elapsed="0.006004"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:19.292502" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:19.292167" elapsed="0.000395">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:19.291953" elapsed="0.000671">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:19.291935" elapsed="0.000721">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:19.292702" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:19.253222" elapsed="0.039578">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.292977" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.293146" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:19.293207" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:19.250720" elapsed="0.042610">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.293555" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.293737" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.293909" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.294073" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.294243" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:19.294425" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:19.294489" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:19.247816" elapsed="0.046771">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:20.321123" 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-11T01:01:20.320604" elapsed="0.000556"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:20.321663" 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-11T01:01:20.321344" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:20.321739" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T01:01:20.321910" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:20.320190" elapsed="0.001745"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:20.326846" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:20.326651" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:20.327026" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:20.327676" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:20.327374" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:20.328407" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:20.327924" elapsed="0.000529"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:20.328609" elapsed="0.000206"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:20.329188" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:20.328979" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:20.329654" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:20.329404" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:20.330203" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:20.329861" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:20.330666" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:20.330424" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:20.331153" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:20.330866" elapsed="0.000314"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:20.337792" elapsed="0.000326"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:20.346926" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:20.347718" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:20.347305" elapsed="0.000441"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:20.348937" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:20.348341" elapsed="0.000758">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:20.349267" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:20.347937" elapsed="0.001472">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.349593" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.349771" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.349951" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.350125" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.350297" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.350491" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.350662" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.350838" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.351005" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.351286" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.351531" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.351730" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:20.351151" elapsed="0.000660"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:20.351076" elapsed="0.000764"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.351985" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:20.352044" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:20.346432" elapsed="0.005719">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:20.352222" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:20.335482" elapsed="0.016845">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.352524" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.357000" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.357235" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:20.357302" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:20.326096" elapsed="0.031362">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:20.357572" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:20.357615" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:20.325540" elapsed="0.032098"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:20.357846" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:20.357723" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:20.357702" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:20.359203" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:20.359884" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:20.359580" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:20.360707" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:20.360444" elapsed="0.000367">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:20.360874" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:20.360092" elapsed="0.000885">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.361149" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.361326" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.361536" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.361708" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.361874" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.362037" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.362200" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.362370" elapsed="0.000050"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.362569" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.362826" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.362998" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.363159" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:20.362696" elapsed="0.000515"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:20.362632" elapsed="0.000604"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.363376" elapsed="0.000034"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:20.363449" elapsed="0.000048"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:20.358664" elapsed="0.004926">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:20.363702" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:20.363746" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:20.358061" elapsed="0.005707"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:20.364374" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:20.364061" elapsed="0.000390">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:20.363848" elapsed="0.000666">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:20.363830" elapsed="0.000716">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:20.364592" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:20.324966" elapsed="0.039721">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.364876" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.365044" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:20.365105" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:20.322283" elapsed="0.042919">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.365371" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.365566" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.365737" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.365898" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.366066" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:20.366228" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:20.366290" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:20.319365" elapsed="0.047034">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:21.401402" 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-11T01:01:21.400929" elapsed="0.000507"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:21.401993" 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-11T01:01:21.401680" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:21.402069" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:01:21.402238" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:21.400541" elapsed="0.001722"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:21.406956" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:21.406770" elapsed="0.000213"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:21.407152" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:21.407760" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:21.407538" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:21.408241" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:21.407981" elapsed="0.000334"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:21.408486" elapsed="0.000185"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:21.409072" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:21.408828" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:21.409623" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:21.409305" elapsed="0.000362"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:21.410197" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:21.409827" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:21.410669" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:21.410427" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:21.411151" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:21.410869" elapsed="0.000309"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:21.418018" elapsed="0.000262"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:21.427364" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:21.428179" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:21.427744" elapsed="0.000466"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:21.429431" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:21.428883" elapsed="0.000701">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:21.429747" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:21.428480" elapsed="0.001386">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.430043" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.430218" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.430411" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.430585" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.430752" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.430915" elapsed="0.000056"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.431123" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.431298" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.431478" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.431753" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.431979" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.432172" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:21.431622" elapsed="0.000663"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:21.431551" elapsed="0.000766"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.432480" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:21.432543" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:21.426858" elapsed="0.005793">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:21.432719" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:21.415657" elapsed="0.017159">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.433008" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.437284" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.437530" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:21.437598" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:21.406217" elapsed="0.031487">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:21.437815" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:21.437859" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:21.405665" elapsed="0.032216"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:21.438088" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:21.437969" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:21.437948" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:21.439473" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:21.440258" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:21.439863" elapsed="0.000432"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:21.441206" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:21.440940" elapsed="0.000394">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:21.441420" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:21.440562" elapsed="0.000966">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.441720" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.441897" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.442073" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.442243" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.442428" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.442599" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.442767" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.442957" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.443129" elapsed="0.001995"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.445413" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.445598" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.445787" elapsed="0.000026"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:21.445258" elapsed="0.000591"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:21.445184" elapsed="0.000702"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.446068" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:21.446151" elapsed="0.000021"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:21.438909" elapsed="0.007370">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:21.446424" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:21.446470" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:21.438306" elapsed="0.008188"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:21.447161" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:21.446815" elapsed="0.000410">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:21.446581" elapsed="0.000710">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:21.446560" elapsed="0.000765">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:21.447372" elapsed="0.000033"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:21.405101" elapsed="0.042390">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.447673" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.447890" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:21.447955" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:21.402583" elapsed="0.045472">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.448240" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.448449" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.448624" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.448791" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.448963" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:21.449132" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:21.449195" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:21.399702" elapsed="0.049593">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:22.481251" 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-11T01:01:22.480790" elapsed="0.000495"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:22.481772" 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-11T01:01:22.481474" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:22.481848" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:01:22.482018" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:22.480380" elapsed="0.001664"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:22.486802" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:22.486610" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:22.486984" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:22.487562" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:22.487336" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:22.488047" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:22.487791" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:22.488240" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:22.488798" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:22.488592" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:22.489241" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:22.488996" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:22.489896" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:22.489460" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:22.490530" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:22.490094" elapsed="0.000482"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:22.491020" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:22.490732" elapsed="0.000314"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:22.497643" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:22.506733" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:22.507502" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:22.507097" elapsed="0.000431"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:22.508667" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:22.508125" elapsed="0.000695">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:22.508982" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:22.507715" elapsed="0.001386">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.509282" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.509476" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.509658" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.509832" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.510001" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.510168" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.510337" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.510527" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.510697" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.510973" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.511203" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.511416" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:22.510839" elapsed="0.000661"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:22.510768" elapsed="0.000770"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.511687" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:22.511756" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:22.506224" elapsed="0.005642">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:22.511937" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:22.495315" elapsed="0.016723">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.512263" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.516642" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.516842" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:22.516909" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:22.486046" elapsed="0.030970">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:22.517128" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:22.517172" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:22.485488" elapsed="0.031707"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:22.517418" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:22.517282" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:22.517262" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:22.518796" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:22.519478" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:22.519160" elapsed="0.000344"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:22.520306" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:22.520041" elapsed="0.000374">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:22.520479" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:22.519687" elapsed="0.001032">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.520893" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.521065" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.521240" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.521423" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.521594" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.521761" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.521928" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.522101" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.522267" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.522702" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.522882" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.523049" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:22.522409" elapsed="0.000729"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:22.522331" elapsed="0.000836"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.523314" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:22.523374" elapsed="0.000030"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:22.518237" elapsed="0.005260">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:22.523609" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:22.523652" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:22.517643" elapsed="0.006032"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:22.524308" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:22.523989" elapsed="0.000380">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:22.523770" elapsed="0.000678">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:22.523750" elapsed="0.000731">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:22.524526" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:22.484921" elapsed="0.039702">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.524802" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.524969" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:22.525029" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:22.482344" elapsed="0.042783">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.525297" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.525493" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.525777" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.525941" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.526109" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:22.526273" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:22.526333" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:22.479585" elapsed="0.046861">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:23.562261" 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-11T01:01:23.561795" elapsed="0.000499"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:23.562788" 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-11T01:01:23.562484" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:23.562864" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T01:01:23.563036" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:23.561224" elapsed="0.001837"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:23.567850" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:23.567660" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:23.568033" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:23.568609" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:23.568396" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:23.569081" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:23.568824" elapsed="0.000299"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:23.569272" elapsed="0.000199"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:23.569832" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:23.569625" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:23.570276" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:23.570029" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:23.570839" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:23.570495" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:23.571303" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:23.571037" elapsed="0.000312"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:23.572019" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:23.571519" elapsed="0.000527"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:23.578671" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:23.587733" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:23.588513" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:23.588100" elapsed="0.000445"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:23.589721" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:23.589166" elapsed="0.000706">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:23.590033" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:23.588751" elapsed="0.001404">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.590335" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.590529" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.590710" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.590883" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.591117" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.591305" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.591491" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.591670" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.591840" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.592115" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.592342" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.592555" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:23.591982" elapsed="0.000669"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:23.591910" elapsed="0.000777"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.592844" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:23.592905" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:23.587207" elapsed="0.005808">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:23.593085" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:23.576334" elapsed="0.016852">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.593365" elapsed="0.000046"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.597832" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.598037" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:23.598103" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:23.567080" elapsed="0.031131">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:23.598330" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:23.598374" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:23.566513" elapsed="0.031902"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:23.598643" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:23.598508" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:23.598486" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:23.600089" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:23.600838" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:23.600520" elapsed="0.000345"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:23.601684" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:23.601413" elapsed="0.000366">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:23.601843" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:23.601050" elapsed="0.000900">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.602128" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.602304" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.602501" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.602677" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.602846" elapsed="0.000026"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.603020" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.603188" elapsed="0.000037"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.603393" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.603561" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.604000" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.604176" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.604341" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:23.603865" elapsed="0.000546"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:23.603628" elapsed="0.000814"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.604587" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:23.604646" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:23.599525" elapsed="0.005227">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:23.604864" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:23.604907" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:23.598865" elapsed="0.006065"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:23.605572" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:23.605235" elapsed="0.000398">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:23.605013" elapsed="0.000682">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:23.604993" elapsed="0.000734">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:23.605772" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:23.565944" elapsed="0.039925">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.606102" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.606273" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:23.606335" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:23.563416" elapsed="0.043034">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.606625" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.606807" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.606979" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.607145" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.607348" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:23.607536" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:23.607598" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:23.560396" elapsed="0.047302">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:24.640057" 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-11T01:01:24.639590" elapsed="0.000501"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:24.640591" 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-11T01:01:24.640268" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:24.640668" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:01:24.640839" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:24.639170" elapsed="0.001694"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:24.645749" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:24.645556" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:24.645935" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:24.646510" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:24.646284" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:24.647005" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:24.646745" elapsed="0.000302"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:24.647198" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:24.647863" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:24.647612" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:24.648419" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:24.648149" elapsed="0.000314"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:24.649328" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:24.648622" elapsed="0.000733"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:24.649798" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:24.649555" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:24.650282" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:24.649998" elapsed="0.000310"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:24.656913" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:24.665945" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:24.666754" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:24.666315" elapsed="0.000467"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:24.667948" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:24.667369" elapsed="0.000735">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:24.668268" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:24.666974" elapsed="0.001433">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.668593" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.668769" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.668946" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.669117" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.669283" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.669466" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.669635" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.669805" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.669968" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.670243" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.670485" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.670680" elapsed="0.000038"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:24.670111" elapsed="0.000679"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:24.670040" elapsed="0.000780"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.670967" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:24.671027" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:24.665449" elapsed="0.005702">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:24.671234" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:24.654586" elapsed="0.016813">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.671596" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.675900" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.676099" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:24.676166" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:24.644969" elapsed="0.031304">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:24.676436" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:24.676483" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:24.644351" elapsed="0.032155"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:24.676717" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:24.676594" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:24.676573" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:24.678087" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:24.678854" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:24.678482" elapsed="0.000399"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:24.679744" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:24.679446" elapsed="0.000386">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:24.679893" elapsed="0.000162"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:24.679065" elapsed="0.001081">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.680325" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.680528" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.680741" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.680932" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.681102" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.681268" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.681452" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.681627" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.681790" elapsed="0.000056"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.682093" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.682266" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.682444" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:24.681961" elapsed="0.000538"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:24.681895" elapsed="0.000629"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.682669" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:24.682745" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:24.677546" elapsed="0.005306">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:24.682962" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:24.683005" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:24.676936" elapsed="0.006092"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:24.683704" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:24.683329" elapsed="0.000437">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:24.683108" elapsed="0.000721">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:24.683090" elapsed="0.000771">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:24.683906" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:24.643797" elapsed="0.040207">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.684184" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.684353" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:24.684432" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:24.641169" elapsed="0.043371">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.684710" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.684888" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.685057" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.685220" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.685407" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:24.685582" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:24.685641" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:24.638346" elapsed="0.047573">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:25.716956" 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-11T01:01:25.716469" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:25.717509" 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-11T01:01:25.717172" elapsed="0.000365"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:25.717589" elapsed="0.000045"/>
</return>
<msg time="2026-04-11T01:01:25.717769" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:25.716036" elapsed="0.001761"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:25.722628" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:25.722426" elapsed="0.000230"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:25.722812" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:25.723409" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:25.723166" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:25.724092" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:25.723634" elapsed="0.000502"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:25.724298" elapsed="0.000213"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:25.724877" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:25.724670" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:25.725340" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:25.725081" elapsed="0.000324"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:25.725918" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:25.725573" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:25.726432" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:25.726134" elapsed="0.000344"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:25.726923" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:25.726637" elapsed="0.000313"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:25.733571" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:25.742801" elapsed="0.000233"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:25.743688" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:25.743262" elapsed="0.000453"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:25.744856" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:25.744299" elapsed="0.000711">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:25.745173" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:25.743902" elapsed="0.001386">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.745485" elapsed="0.000025"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.745726" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.745909" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.746083" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.746268" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.746453" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.746624" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.746797" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.746960" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.747230" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.747471" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.747668" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:25.747097" elapsed="0.000650"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:25.747029" elapsed="0.000747"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.747921" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:25.747979" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:25.742294" elapsed="0.005792">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:25.748154" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:25.731276" elapsed="0.016976">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.748444" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.752894" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.753095" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:25.753161" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:25.721839" elapsed="0.031429">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:25.753435" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:25.753483" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:25.721249" elapsed="0.032257"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:25.753765" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:25.753642" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:25.753619" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:25.755181" elapsed="0.000221"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:25.755858" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:25.755560" elapsed="0.000325"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:25.756880" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:25.756470" elapsed="0.000501">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:25.757032" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:25.756110" elapsed="0.001025">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.757309" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.757509" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.757711" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.757887" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.758055" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.758250" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.758443" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.758622" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.758787" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.759043" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.759217" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.759394" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:25.758914" elapsed="0.000535"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:25.758850" elapsed="0.000626"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.759640" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:25.759701" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:25.754637" elapsed="0.005168">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:25.759916" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:25.759959" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:25.753985" elapsed="0.005997"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:25.760661" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:25.760278" elapsed="0.000444">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:25.760062" elapsed="0.000723">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:25.760044" elapsed="0.000807">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:25.760901" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:25.720698" elapsed="0.040302">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.761180" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.761350" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:25.761428" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:25.718108" elapsed="0.043420">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.761699" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.761878" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.762050" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.762230" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.762415" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:25.762584" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:25.762645" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:25.715189" elapsed="0.047553">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:26.799960" 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-11T01:01:26.799344" elapsed="0.000658"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:26.800613" 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-11T01:01:26.800226" elapsed="0.000420"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:26.800707" elapsed="0.000053"/>
</return>
<msg time="2026-04-11T01:01:26.800920" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:26.798843" elapsed="0.002107"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:26.805832" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:26.805614" elapsed="0.000247"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:26.806021" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:26.806636" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:26.806375" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:26.807194" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:26.806930" elapsed="0.000307"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:26.807408" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:26.807965" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:26.807755" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:26.808431" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:26.808167" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:26.808981" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:26.808632" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:26.809439" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:26.809181" elapsed="0.000303"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:26.809953" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:26.809640" elapsed="0.000339"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:26.817415" elapsed="0.000221"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:26.826996" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:26.827789" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:26.827397" elapsed="0.000418"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:26.828976" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:26.828438" elapsed="0.000690">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:26.829297" elapsed="0.000026"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:26.828004" elapsed="0.001447">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.829640" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.829838" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.830017" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.830186" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.830352" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.830534" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.830700" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.830870" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.831034" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.831303" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.831549" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.831745" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:26.831173" elapsed="0.000654"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:26.831103" elapsed="0.000753"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.832001" elapsed="0.000057"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:26.832100" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:26.826500" elapsed="0.005709">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:26.832278" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:26.814422" elapsed="0.017956">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.832576" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.836838" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.837033" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:26.837099" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:26.805048" elapsed="0.032156">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:26.837315" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:26.837358" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:26.804478" elapsed="0.032956"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:26.837645" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:26.837525" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:26.837504" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:26.839019" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:26.839698" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:26.839394" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:26.840518" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:26.840242" elapsed="0.000362">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:26.840666" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:26.839906" elapsed="0.000864">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.840942" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.841114" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.841289" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.841484" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.841704" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.841874" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.842041" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.842214" elapsed="0.000156"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.842538" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.842801" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.842975" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.843139" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:26.842670" elapsed="0.000521"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:26.842605" elapsed="0.000612"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.843358" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:26.843438" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:26.838479" elapsed="0.005065">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:26.843654" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:26.843697" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:26.837878" elapsed="0.005842"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:26.844326" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:26.844013" elapsed="0.000389">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:26.843799" elapsed="0.000667">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:26.843781" elapsed="0.000718">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:26.844544" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:26.803900" elapsed="0.040741">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.844820" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.844988" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:26.845049" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:26.801315" elapsed="0.043831">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.845316" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.845513" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.845713" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.845917" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.846088" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:26.846252" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:26.846313" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:26.797838" elapsed="0.048589">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:27.877671" 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-11T01:01:27.877193" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:27.878174" 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-11T01:01:27.877879" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:27.878249" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:01:27.878435" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:27.876792" elapsed="0.001670"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:27.883182" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:27.882994" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:27.883361" elapsed="0.000206"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:27.883980" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:27.883725" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:27.884490" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:27.884200" elapsed="0.000334"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:27.884686" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:27.887307" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:27.885024" elapsed="0.002312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:27.887794" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:27.887535" elapsed="0.000303"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:27.888390" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:27.888027" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:27.888870" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:27.888624" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:27.889358" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:27.889071" elapsed="0.000317"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:27.896142" elapsed="0.000255"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:27.905350" elapsed="0.000228"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:27.906128" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:27.905737" elapsed="0.000418"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:27.907374" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:27.906845" elapsed="0.000703">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:27.907710" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:27.906446" elapsed="0.001388">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.908013" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.908188" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.908373" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.908634" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.908810" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.908980" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.909151" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.909327" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.909511" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.909787" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.910013" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.910209" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:27.909653" elapsed="0.000637"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:27.909583" elapsed="0.000735"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.910494" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:27.910558" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:27.904861" elapsed="0.005805">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:27.910736" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:27.893807" elapsed="0.017028">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.911013" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.915462" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.915666" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:27.915769" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:27.882450" elapsed="0.033427">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:27.915989" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:27.916033" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:27.881882" elapsed="0.034174"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:27.916269" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:27.916143" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:27.916122" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:27.917716" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:27.918394" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:27.918084" elapsed="0.000370"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:27.919255" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:27.918991" elapsed="0.000360">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:27.919443" elapsed="0.000171"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:27.918649" elapsed="0.001058">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.919891" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.920071" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.920252" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.920443" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.920623" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.920822" elapsed="0.000027"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.921039" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.921235" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.921449" elapsed="0.000025"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.921721" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.921897" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.922063" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:27.921588" elapsed="0.000527"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:27.921522" elapsed="0.000620"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.922285" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:27.922344" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:27.917151" elapsed="0.005319">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:27.922587" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:27.922669" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:27.916504" elapsed="0.006191"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:27.923343" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:27.923018" elapsed="0.000423">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:27.922789" elapsed="0.000731">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:27.922764" elapsed="0.000790">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:27.923601" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:27.881315" elapsed="0.042387">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.923883" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.924052" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:27.924113" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:27.878765" elapsed="0.045446">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.924384" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.924581" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.924755" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.924918" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.925133" elapsed="0.000025"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:27.925308" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:27.925369" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:27.875956" elapsed="0.049528">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:28.960042" 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-11T01:01:28.959365" elapsed="0.000711"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:28.960566" 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-11T01:01:28.960251" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:28.960641" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:01:28.960808" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:28.958957" elapsed="0.001875"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:28.965845" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:28.965648" elapsed="0.000225"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:28.966031" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:28.966612" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:28.966381" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:28.967094" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:28.966835" elapsed="0.000301"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:28.967286" elapsed="0.000202"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:28.967854" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:28.967645" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:28.968579" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:28.968053" elapsed="0.000570"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:28.969134" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:28.968782" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:28.969586" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:28.969330" elapsed="0.000319"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:28.970084" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:28.969803" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:28.976861" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:28.986433" elapsed="0.000245"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:28.987489" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:28.986909" elapsed="0.000616"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:28.988725" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:28.988163" elapsed="0.000717">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:28.989046" elapsed="0.000024"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:28.987733" elapsed="0.001471">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.989390" elapsed="0.000046"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.989599" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.989784" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.989961" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.990135" elapsed="0.000025"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.990489" elapsed="0.000023"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.990666" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.990841" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.991009" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.991315" elapsed="0.000110"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.991648" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.991845" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:28.991162" elapsed="0.000764"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:28.991084" elapsed="0.000872"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.992118" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:28.992179" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:28.985784" elapsed="0.006505">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:28.992357" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:28.974509" elapsed="0.017974">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.992669" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.997109" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:28.997311" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:28.997377" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:28.965001" elapsed="0.032502">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:28.997631" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:28.997677" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:28.964444" elapsed="0.033256"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:28.997931" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:28.997794" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:28.997772" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:28.999432" elapsed="0.000247"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:29.000222" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:28.999879" elapsed="0.000390"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:29.001124" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:29.000850" elapsed="0.000373">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:29.001284" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:29.000484" elapsed="0.000907">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.001606" elapsed="0.000028"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.001920" elapsed="0.000030"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.002165" elapsed="0.000295"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.002698" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.002980" elapsed="0.000028"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.003203" elapsed="0.000027"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.003446" elapsed="0.000029"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.003676" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.003907" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.004195" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.004383" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.004570" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:29.004059" elapsed="0.000566"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:29.003984" elapsed="0.000670"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.004798" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:29.004859" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:28.998859" elapsed="0.006110">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:29.005086" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:29.005129" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:28.998156" elapsed="0.006996"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:29.005853" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:29.005504" elapsed="0.000416">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:29.005237" elapsed="0.000745">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:29.005217" elapsed="0.000825">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:29.006090" elapsed="0.000034"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:28.963853" elapsed="0.042360">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.006423" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.006606" elapsed="0.000104"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:29.006754" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:28.961246" elapsed="0.045610">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.007085" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.007271" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.007477" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.007649" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.007824" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:29.007992" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:29.008053" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:28.958080" elapsed="0.050076">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:30.041800" 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-11T01:01:30.041321" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:30.042301" 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-11T01:01:30.042006" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:30.042376" elapsed="0.000057"/>
</return>
<msg time="2026-04-11T01:01:30.042564" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:30.040921" elapsed="0.001668"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:30.047327" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:30.047109" elapsed="0.000244"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:30.047525" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:30.048087" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:30.047878" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:30.048581" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:30.048306" elapsed="0.000317"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:30.048773" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:30.049308" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:30.049104" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:30.049963" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:30.049520" elapsed="0.000485"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:30.050524" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:30.050161" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:30.050960" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:30.050721" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:30.051480" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:30.051156" elapsed="0.000352"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:30.058118" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:30.067294" elapsed="0.000242"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:30.068113" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:30.067700" elapsed="0.000440"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:30.069311" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:30.068774" elapsed="0.000710">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:30.069651" elapsed="0.000024"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:30.068341" elapsed="0.001439">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.069960" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.070137" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.070317" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.070509" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.070681" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.070849" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.071018" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.071190" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.071356" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.071660" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.071911" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.072112" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:30.071525" elapsed="0.000667"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:30.071448" elapsed="0.000775"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.072371" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:30.072455" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:30.066770" elapsed="0.005796">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:30.072634" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:30.055819" elapsed="0.016915">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.072914" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.077244" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.077563" elapsed="0.000024"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:30.077633" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:30.046568" elapsed="0.031173">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:30.078039" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:30.078083" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:30.045982" elapsed="0.032125"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:30.078335" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:30.078201" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:30.078178" elapsed="0.000240"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:30.079755" elapsed="0.000330"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:30.080568" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:30.080243" elapsed="0.000351"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:30.081593" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:30.081116" elapsed="0.000571">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:30.081751" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:30.080778" elapsed="0.001078">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.082034" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.082210" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.082391" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.082582" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.082751" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.082918" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.083085" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.083256" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.083437" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.083698" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.083871" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.084036" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:30.083568" elapsed="0.000523"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:30.083503" elapsed="0.000624"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.084272" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:30.084330" elapsed="0.000053"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:30.079186" elapsed="0.005308">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:30.084608" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:30.084651" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:30.078577" elapsed="0.006097"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:30.085298" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:30.084976" elapsed="0.000384">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:30.084756" elapsed="0.000685">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:30.084737" elapsed="0.000739">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:30.085522" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:30.045431" elapsed="0.040189">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.085801" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.085972" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:30.086034" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:30.042893" elapsed="0.043241">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.086307" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.086506" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.086682" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.086846" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.087019" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:30.087185" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:30.087247" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:30.040078" elapsed="0.047269">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:31.134318" 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-11T01:01:31.133580" elapsed="0.000787"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:31.135043" 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-11T01:01:31.134738" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:31.135120" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T01:01:31.135291" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:31.132970" elapsed="0.002346"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:31.140042" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:31.139853" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:31.140224" elapsed="0.000208"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:31.140802" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:31.140592" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:31.141504" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:31.141019" elapsed="0.000528"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:31.141700" elapsed="0.000221"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:31.142285" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:31.142079" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:31.142746" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:31.142501" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:31.143280" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:31.142943" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:31.143731" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:31.143493" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:31.144246" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:31.143929" elapsed="0.000351"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:31.150854" elapsed="0.000234"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:31.159979" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:31.160818" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:31.160397" elapsed="0.000447"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:31.162001" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:31.161466" elapsed="0.000720">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:31.162351" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:31.161039" elapsed="0.001454">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.162672" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.162845" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.163019" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.163188" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.163352" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.163536" elapsed="0.000071"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.163761" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.163932" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.164120" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.164452" elapsed="0.000029"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.164759" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.165021" elapsed="0.000029"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:31.164272" elapsed="0.000853"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:31.164197" elapsed="0.000958"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.165305" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:31.165365" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:31.159475" elapsed="0.006026">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:31.165571" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:31.148560" elapsed="0.017112">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.165854" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.170846" elapsed="0.000035"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.171107" elapsed="0.000033"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:31.171200" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:31.139294" elapsed="0.032054">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:31.171532" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:31.171589" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:31.138733" elapsed="0.032885"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:31.171906" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:31.171740" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:31.171711" elapsed="0.000280"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:31.173808" elapsed="0.000276"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:31.174773" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:31.174293" elapsed="0.000513"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:31.175868" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:31.175521" elapsed="0.000537">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:31.176139" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:31.175056" elapsed="0.001218">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.176508" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.176688" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.176869" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.177039" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.177206" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.177370" elapsed="0.000024"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.177560" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.177734" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.178029" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.178301" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.178516" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.178684" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:31.178170" elapsed="0.000568"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:31.178098" elapsed="0.000670"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.178914" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:31.178974" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:31.173069" elapsed="0.006012">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:31.179195" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:31.179239" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:31.172200" elapsed="0.007062"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:31.179924" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:31.179591" elapsed="0.000396">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:31.179346" elapsed="0.000705">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:31.179326" elapsed="0.000759">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:31.180131" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:31.138156" elapsed="0.042074">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.180426" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.180657" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:31.180723" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:31.135642" elapsed="0.045186">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.181002" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.181184" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.181357" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.181544" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.181717" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:31.181902" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:31.181975" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:31.131795" elapsed="0.050283">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:32.215807" 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-11T01:01:32.215326" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:32.216307" 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-11T01:01:32.216012" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:32.216381" elapsed="0.000056"/>
</return>
<msg time="2026-04-11T01:01:32.216567" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:32.214939" elapsed="0.001653"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:32.221302" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:32.221111" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:32.221499" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:32.222060" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:32.221851" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:32.222547" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:32.222274" elapsed="0.000315"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:32.222741" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:32.223282" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:32.223077" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:32.223739" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:32.223495" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:32.224353" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:32.223936" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:32.224816" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:32.224571" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:32.225318" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:32.225033" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:32.232086" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:32.241087" elapsed="0.000231"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:32.241875" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:32.241494" elapsed="0.000407"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:32.243034" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:32.242507" elapsed="0.000678">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:32.243345" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:32.242087" elapsed="0.001394">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.243659" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.243833" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.244010" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.244179" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.244347" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.244532" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.244699" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.244870" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.245034" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.245331" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.245586" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.245780" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:32.245172" elapsed="0.000686"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:32.245103" elapsed="0.000784"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.246031" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:32.246089" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:32.240596" elapsed="0.005601">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:32.246265" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:32.229807" elapsed="0.016557">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.246601" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.250851" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.251044" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:32.251109" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:32.220532" elapsed="0.030681">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:32.251323" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:32.251366" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:32.219963" elapsed="0.031430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:32.251649" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:32.251531" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:32.251510" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:32.253024" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:32.253739" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:32.253432" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:32.254573" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:32.254290" elapsed="0.000370">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:32.254721" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:32.253949" elapsed="0.000874">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.254997" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.255172" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.255348" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.255549" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.255719" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.255887" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.256053" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.256224" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.256392" elapsed="0.000032"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.256811" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.256986" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.257151" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:32.256673" elapsed="0.000565"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:32.256469" elapsed="0.000797"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.257438" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:32.257501" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:32.252479" elapsed="0.005125">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:32.257715" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:32.257758" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:32.251874" elapsed="0.005907"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:32.258395" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:32.258078" elapsed="0.000393">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:32.257862" elapsed="0.000671">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:32.257844" elapsed="0.000721">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:32.258610" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:32.219412" elapsed="0.039293">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.258883" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.259051" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:32.259114" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:32.216917" elapsed="0.042294">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.259382" elapsed="0.000037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.259582" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.259754" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.259918" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.260088" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:32.260253" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:32.260314" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:32.214119" elapsed="0.046308">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:33.292295" 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-11T01:01:33.291825" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:33.292825" 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-11T01:01:33.292521" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:33.292899" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T01:01:33.293070" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:33.291425" elapsed="0.001670"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:33.297852" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:33.297663" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:33.298033" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:33.298601" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:33.298376" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:33.299069" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:33.298818" elapsed="0.000293"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:33.299258" elapsed="0.000203"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:33.299822" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:33.299617" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:33.300450" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:33.300016" elapsed="0.000478"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:33.300996" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:33.300652" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:33.301461" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:33.301193" elapsed="0.000313"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:33.301951" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:33.301660" elapsed="0.000317"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:33.308648" elapsed="0.000217"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:33.317733" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:33.318536" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:33.318119" elapsed="0.000443"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:33.319716" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:33.319165" elapsed="0.000702">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:33.320028" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:33.318750" elapsed="0.001398">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.320326" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.320522" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.320701" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.320877" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.321109" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.321278" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.321464" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.321684" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.321857" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.322131" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.322363" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.322578" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:33.321996" elapsed="0.000663"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:33.321926" elapsed="0.000762"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.322835" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:33.322895" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:33.317200" elapsed="0.005803">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:33.323072" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:33.306307" elapsed="0.016865">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.323350" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.327720" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.327920" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:33.327985" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:33.297083" elapsed="0.031008">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:33.328203" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:33.328246" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:33.296524" elapsed="0.031745"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:33.328496" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:33.328354" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:33.328334" elapsed="0.000228"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:33.329889" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:33.330616" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:33.330289" elapsed="0.000352"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:33.333538" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:33.331164" elapsed="0.002467">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:33.333694" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:33.330826" elapsed="0.002988">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.333993" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.334168" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.334343" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.334533" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.334703" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.334869" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.335033" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.335202" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.335366" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.335643" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.335814" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.335976" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:33.335513" elapsed="0.000516"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:33.335447" elapsed="0.000608"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.336197" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:33.336255" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:33.329300" elapsed="0.007059">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:33.336488" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:33.336533" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:33.328714" elapsed="0.007841"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:33.337177" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:33.336861" elapsed="0.000376">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:33.336637" elapsed="0.000662">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:33.336618" elapsed="0.000713">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:33.337376" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:33.295959" elapsed="0.041533">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.337709" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.337910" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:33.337974" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:33.293443" elapsed="0.044627">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.338239" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.338436" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.338611" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.338774" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.338941" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:33.339106" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:33.339167" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:33.290616" elapsed="0.048647">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:34.370298" 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-11T01:01:34.369816" elapsed="0.000516"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:34.370845" 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-11T01:01:34.370530" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:34.370927" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T01:01:34.371102" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:34.369407" elapsed="0.001721"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:34.376536" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:34.376297" elapsed="0.000278"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:34.376777" elapsed="0.000249"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:34.377470" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:34.377212" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:34.378026" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:34.377715" elapsed="0.000360"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:34.378240" elapsed="0.000454"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:34.379122" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:34.378862" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:34.379818" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:34.379451" elapsed="0.000412"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:34.380415" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:34.380031" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:34.380872" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:34.380624" elapsed="0.000305"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:34.381538" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:34.381125" elapsed="0.000442"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:34.389848" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:34.399473" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:34.400291" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:34.399877" elapsed="0.000442"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:34.401514" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:34.400951" elapsed="0.000716">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:34.401831" elapsed="0.000023"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:34.400542" elapsed="0.001414">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.402139" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.402319" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.402521" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.402698" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.402869" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.403039" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.403209" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.403389" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.403579" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.403885" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.404121" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.404317" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:34.403723" elapsed="0.000691"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:34.403652" elapsed="0.000794"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.404592" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:34.404651" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:34.398941" elapsed="0.005819">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:34.404830" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:34.386747" elapsed="0.018252">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.405252" elapsed="0.000024"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.409687" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.409890" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:34.409957" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:34.375647" elapsed="0.034420">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:34.410185" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:34.410231" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:34.374878" elapsed="0.035377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:34.410497" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:34.410347" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:34.410325" elapsed="0.000239"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:34.411924" elapsed="0.000237"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:34.412650" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:34.412321" elapsed="0.000355"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:34.413668" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:34.413208" elapsed="0.000556">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:34.413832" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:34.412866" elapsed="0.001071">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.414116" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.414291" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.414489" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.414667" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.414854" elapsed="0.000026"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.415035" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.415206" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.415380" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.415567" elapsed="0.000059"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.415874" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.416066" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.416233" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:34.415742" elapsed="0.000545"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:34.415675" elapsed="0.000638"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.416472" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:34.416532" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:34.411356" elapsed="0.005283">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:34.416751" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:34.416794" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:34.410738" elapsed="0.006079"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:34.417451" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:34.417115" elapsed="0.000398">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:34.416897" elapsed="0.000678">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:34.416879" elapsed="0.000728">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:34.417652" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:34.374144" elapsed="0.043608">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.417932" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.418102" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:34.418164" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:34.371459" elapsed="0.046805">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.418454" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.418640" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.418815" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.418982" elapsed="0.000026"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.419169" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:34.419337" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:34.419418" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:34.368573" elapsed="0.050986">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:35.450950" 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-11T01:01:35.450465" elapsed="0.000520"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:35.451499" 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-11T01:01:35.451164" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:35.451580" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T01:01:35.451758" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:35.450031" elapsed="0.001754"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:35.456763" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:35.456573" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:35.456945" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:35.457515" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:35.457288" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:35.457986" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:35.457733" elapsed="0.000295"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:35.458176" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:35.458957" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:35.458526" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:35.459420" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:35.459157" elapsed="0.000305"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:35.459990" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:35.459621" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:35.460446" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:35.460191" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:35.460927" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:35.460644" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:35.467616" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:35.476706" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:35.477524" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:35.477086" elapsed="0.000464"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:35.478709" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:35.478141" elapsed="0.000722">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:35.479030" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:35.477741" elapsed="0.001410">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.479342" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.479609" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.479797" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.479980" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.480186" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.480370" elapsed="0.000037"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.480565" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.480745" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.480916" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.481197" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.481458" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.481661" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:35.481060" elapsed="0.000687"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:35.480988" elapsed="0.000788"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.481929" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:35.481991" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:35.476194" elapsed="0.005908">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:35.482172" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:35.465305" elapsed="0.016970">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.482491" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.486946" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.487148" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:35.487234" elapsed="0.000021"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:35.456003" elapsed="0.031349">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:35.487509" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:35.487555" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:35.455332" elapsed="0.032246"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:35.487842" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:35.487714" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:35.487691" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:35.489293" elapsed="0.000271"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:35.490054" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:35.489729" elapsed="0.000352"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:35.491103" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:35.490641" elapsed="0.000564">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:35.491271" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:35.490271" elapsed="0.001115">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.491586" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.491769" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.491956" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.492135" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.492389" elapsed="0.000045"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.492640" elapsed="0.000026"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.492864" elapsed="0.000027"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.493098" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.493310" elapsed="0.000029"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.493690" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.493941" elapsed="0.000030"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.494172" elapsed="0.000027"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:35.493512" elapsed="0.000730"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:35.493421" elapsed="0.000856"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.494464" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:35.494540" elapsed="0.000020"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:35.488736" elapsed="0.005920">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:35.494777" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:35.494820" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:35.488069" elapsed="0.006775"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:35.495619" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:35.495194" elapsed="0.000505">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:35.494930" elapsed="0.000849">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:35.494909" elapsed="0.000965">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:35.495940" elapsed="0.000020"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:35.454773" elapsed="0.041297">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.496325" elapsed="0.000028"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.496542" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:35.496607" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:35.452154" elapsed="0.044557">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.496884" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.497068" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.497241" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.497422" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.497594" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:35.497760" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:35.497821" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:35.449116" elapsed="0.048806">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:36.529678" 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-11T01:01:36.529172" elapsed="0.000540"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:36.530181" 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-11T01:01:36.529885" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:36.530256" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:01:36.530486" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:36.528769" elapsed="0.001744"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:36.535845" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:36.535605" elapsed="0.000275"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:36.536084" elapsed="0.000240"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:36.536811" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:36.536549" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:36.537795" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:36.537188" elapsed="0.000660"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:36.538046" elapsed="0.000207"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:36.538694" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:36.538432" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:36.539162" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:36.538907" elapsed="0.000297"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:36.539766" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:36.539375" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:36.540206" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:36.539966" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:36.540763" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:36.540422" elapsed="0.000375"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:36.547930" elapsed="0.000250"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:36.557893" elapsed="0.000235"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:36.558828" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:36.558299" elapsed="0.000560"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:36.560129" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:36.559561" elapsed="0.000723">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:36.560474" elapsed="0.000024"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:36.559083" elapsed="0.001521">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.560792" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.560977" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.561178" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.561361" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.561555" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.561729" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.561904" elapsed="0.000027"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.562123" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.562315" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.562620" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.562943" elapsed="0.000025"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.563175" elapsed="0.000024"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:36.562484" elapsed="0.000778"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:36.562409" elapsed="0.000882"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.563458" elapsed="0.000089"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:36.563590" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:36.557340" elapsed="0.006363">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:36.563774" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:36.545479" elapsed="0.018398">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.564063" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.568774" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.568980" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:36.569047" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:36.534889" elapsed="0.034268">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:36.569290" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:36.569335" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:36.534114" elapsed="0.035245"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:36.569607" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:36.569472" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:36.569449" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:36.571094" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:36.571801" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:36.571484" elapsed="0.000358"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:36.572765" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:36.572490" elapsed="0.000369">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:36.572924" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:36.572095" elapsed="0.000935">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.573206" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.573381" elapsed="0.000037"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.573576" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.573767" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.573997" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.574171" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.574341" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.574536" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.574704" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.575011" elapsed="0.000024"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.575193" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.575359" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:36.574860" elapsed="0.000572"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:36.574770" elapsed="0.000689"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.575604" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:36.575664" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:36.570502" elapsed="0.005269">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:36.575884" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:36.575929" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:36.569831" elapsed="0.006120"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:36.576618" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:36.576251" elapsed="0.000438">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:36.576032" elapsed="0.000720">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:36.576014" elapsed="0.000771">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:36.576830" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:36.533432" elapsed="0.043496">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.577110" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.577281" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:36.577343" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:36.530814" elapsed="0.046647">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.577660" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.577864" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.578038" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.578258" elapsed="0.000024"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.578456" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:36.578626" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:36.578688" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:36.527881" elapsed="0.050919">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:37.610217" 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-11T01:01:37.609760" elapsed="0.000491"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:37.610737" 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-11T01:01:37.610442" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:37.610813" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T01:01:37.610981" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:37.609345" elapsed="0.001661"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:37.615728" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:37.615511" elapsed="0.000244"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:37.615910" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:37.616481" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:37.616254" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:37.616951" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:37.616699" elapsed="0.000293"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:37.617141" elapsed="0.000177"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:37.617693" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:37.617488" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:37.618132" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:37.617891" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:37.618681" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:37.618326" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:37.619112" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:37.618878" elapsed="0.000277"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:37.619607" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:37.619307" elapsed="0.000341"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:37.626340" elapsed="0.000229"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:37.635339" elapsed="0.000251"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:37.636188" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:37.635778" elapsed="0.000436"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:37.637472" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:37.636928" elapsed="0.000695">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:37.637787" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:37.636519" elapsed="0.001386">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.638084" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.638261" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.638459" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.638635" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.638806" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.638974" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.639141" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.639313" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.639495" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.639770" elapsed="0.000058"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.640041" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.640242" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:37.639636" elapsed="0.000688"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:37.639565" elapsed="0.000787"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.640542" elapsed="0.000025"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:37.640609" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:37.634851" elapsed="0.005868">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:37.640787" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:37.624051" elapsed="0.016836">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.641071" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.645499" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.645701" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:37.645808" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:37.614956" elapsed="0.030964">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:37.646037" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:37.646081" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:37.614388" elapsed="0.031717"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:37.646316" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:37.646193" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:37.646172" elapsed="0.000229"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:37.647735" elapsed="0.000255"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:37.648501" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:37.648153" elapsed="0.000376"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:37.649345" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:37.649076" elapsed="0.000411">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:37.649573" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:37.648720" elapsed="0.000964">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.649863" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.650039" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.650218" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.650430" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.650607" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.650776" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.650946" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.651122" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.651291" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.651738" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.651958" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.652133" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:37.651600" elapsed="0.000587"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:37.651358" elapsed="0.000855"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.652357" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:37.652436" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:37.647163" elapsed="0.005383">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:37.652658" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:37.652739" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:37.646560" elapsed="0.006204"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:37.653404" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:37.653065" elapsed="0.000404">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:37.652846" elapsed="0.000688">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:37.652827" elapsed="0.000740">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:37.653615" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:37.613829" elapsed="0.039905">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.653919" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.654093" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:37.654158" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:37.611305" elapsed="0.042955">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.654451" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.654637" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.654813" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.654986" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.655177" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:37.655350" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:37.655431" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:37.608548" elapsed="0.046996">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:38.688088" 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-11T01:01:38.687633" elapsed="0.000489"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:38.688607" 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-11T01:01:38.688294" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:38.688681" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T01:01:38.688848" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:38.687204" elapsed="0.001668"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:38.693702" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:38.693513" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:38.693883" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:38.694468" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:38.694226" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:38.694940" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:38.694687" elapsed="0.000295"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:38.695130" elapsed="0.000177"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:38.695710" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:38.695503" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:38.696314" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:38.695905" elapsed="0.000450"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:38.696890" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:38.696527" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:38.697319" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:38.697086" elapsed="0.000276"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:38.697813" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:38.697531" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:38.704373" elapsed="0.000226"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:38.713364" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:38.714125" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:38.713746" elapsed="0.000405"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:38.715276" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:38.714751" elapsed="0.000695">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:38.715635" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:38.714336" elapsed="0.001422">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.715941" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.716120" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.716297" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.716488" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.716659" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.716828" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.716997" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.717169" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.717334" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.717625" elapsed="0.000067"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.717903" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.718098" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:38.717491" elapsed="0.000689"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:38.717420" elapsed="0.000789"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.718354" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:38.718432" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:38.712873" elapsed="0.005669">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:38.718611" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:38.702081" elapsed="0.016630">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.718892" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.723186" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.723385" elapsed="0.000076"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:38.723507" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:38.692953" elapsed="0.030661">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:38.723742" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:38.723786" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:38.692342" elapsed="0.031467"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:38.724026" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:38.723897" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:38.723876" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:38.725443" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:38.726137" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:38.725829" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:38.727119" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:38.726703" elapsed="0.000508">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:38.727274" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:38.726348" elapsed="0.001028">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.727575" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.727855" elapsed="0.000027"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.728046" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.728220" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.728448" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.728673" elapsed="0.000038"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.728924" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.729115" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.729280" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.729560" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.729732" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.729895" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:38.729429" elapsed="0.000517"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:38.729344" elapsed="0.000628"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.730113" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:38.730171" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:38.724880" elapsed="0.005396">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:38.730403" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:38.730450" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:38.724242" elapsed="0.006231"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:38.731091" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:38.730770" elapsed="0.000381">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:38.730554" elapsed="0.000658">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:38.730535" elapsed="0.000709">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:38.731289" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:38.691792" elapsed="0.039613">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.731586" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.731777" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:38.731841" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:38.689254" elapsed="0.042684">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.732146" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.732325" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.732514" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.732680" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.732850" elapsed="0.000028"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:38.733055" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:38.733118" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:38.686426" elapsed="0.046791">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:39.767228" 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-11T01:01:39.766745" elapsed="0.000517"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:39.767767" 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-11T01:01:39.767454" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:39.767844" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T01:01:39.768018" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:39.766315" elapsed="0.001729"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:39.774921" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:39.774729" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:39.775108" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:39.775688" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:39.775473" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:39.776172" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:39.775913" elapsed="0.000301"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:39.776365" elapsed="0.000202"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:39.776951" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:39.776735" elapsed="0.000242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:39.777409" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:39.777149" elapsed="0.000304"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:39.777969" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:39.777609" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:39.778464" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:39.778170" elapsed="0.000339"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:39.778957" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:39.778662" elapsed="0.000322"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:39.785598" elapsed="0.000282"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:39.794712" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:39.795521" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:39.795102" elapsed="0.000446"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:39.796697" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:39.796143" elapsed="0.000705">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:39.797019" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:39.795747" elapsed="0.001397">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.797324" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.797523" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.797703" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.797877" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.798046" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.798213" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.798409" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.798586" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.798753" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.799028" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.799255" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.799467" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:39.798896" elapsed="0.000655"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:39.798824" elapsed="0.000755"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.799725" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:39.799786" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:39.794140" elapsed="0.005753">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:39.799963" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:39.783309" elapsed="0.016754">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.800241" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.804746" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.804996" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:39.805062" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:39.774091" elapsed="0.031076">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:39.805278" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:39.805322" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:39.773509" elapsed="0.031836"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:39.805584" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:39.805450" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:39.805429" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:39.806991" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:39.807671" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:39.807353" elapsed="0.000343"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:39.808503" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:39.808217" elapsed="0.000372">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:39.808651" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:39.807880" elapsed="0.000871">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.808926" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.809104" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.809280" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.809471" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.809643" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.809808" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.809974" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.810147" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.810312" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.810622" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.810799" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.810964" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:39.810487" elapsed="0.000534"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:39.810376" elapsed="0.000671"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.811188" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:39.811246" elapsed="0.000048"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:39.806447" elapsed="0.004956">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:39.811517" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:39.811561" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:39.805803" elapsed="0.005781"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:39.812203" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:39.811881" elapsed="0.000383">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:39.811665" elapsed="0.000662">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:39.811647" elapsed="0.000712">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:39.812423" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:39.772927" elapsed="0.039596">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.812701" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.812871" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:39.812932" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:39.768347" elapsed="0.044682">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.813198" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.813377" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.813567" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.813731" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.813901" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:39.814065" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:39.814125" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:39.765510" elapsed="0.048837">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:40.847279" 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-11T01:01:40.846810" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:40.847921" 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-11T01:01:40.847602" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:40.848038" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T01:01:40.848219" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:40.846378" elapsed="0.001867"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:40.853233" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:40.853024" elapsed="0.000241"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:40.853451" elapsed="0.000198"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:40.854024" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:40.853811" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:40.854534" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:40.854247" elapsed="0.000333"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:40.854742" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:40.855322" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:40.855104" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:40.855800" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:40.855545" elapsed="0.000301"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:40.856416" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:40.856045" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:40.856874" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:40.856627" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:40.857361" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:40.857073" elapsed="0.000333"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:40.864228" elapsed="0.000228"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:40.873310" elapsed="0.000235"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:40.874092" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:40.873706" elapsed="0.000412"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:40.875285" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:40.874738" elapsed="0.000720">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:40.875622" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:40.874315" elapsed="0.001428">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.875923" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.876128" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.876311" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.876500" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.876667" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.876832" elapsed="0.000059"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.877043" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.877215" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.877386" elapsed="0.000033"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.877678" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.877906" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.878108" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:40.877544" elapsed="0.000643"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:40.877471" elapsed="0.000745"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.878362" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:40.878442" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:40.872806" elapsed="0.005745">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:40.878619" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:40.861887" elapsed="0.016832">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.878898" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.883241" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.883491" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:40.883560" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:40.852450" elapsed="0.031216">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:40.883778" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:40.883821" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:40.851803" elapsed="0.032041"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:40.884049" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:40.883932" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:40.883911" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:40.885487" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:40.886160" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:40.885859" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:40.886991" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:40.886726" elapsed="0.000388">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:40.887177" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:40.886368" elapsed="0.000913">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.887480" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.887660" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.887840" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.888014" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.888238" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.888430" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.888607" elapsed="0.000026"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.888809" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.888978" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.889235" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.889428" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.889595" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:40.889105" elapsed="0.000543"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:40.889042" elapsed="0.000632"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.889816" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:40.889874" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:40.884912" elapsed="0.005067">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:40.890089" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:40.890132" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:40.884293" elapsed="0.005862"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:40.890966" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:40.890468" elapsed="0.000558">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:40.890235" elapsed="0.000855">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:40.890217" elapsed="0.000905">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:40.891167" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:40.851206" elapsed="0.040057">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.891459" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.891669" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:40.891732" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:40.848573" elapsed="0.043259">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.892003" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.892205" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.892381" elapsed="0.000035"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.892563" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.892733" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:40.892898" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:40.892959" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:40.845524" elapsed="0.047533">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.925132" 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-11T01:01:41.924626" elapsed="0.000543"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.925676" 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-11T01:01:41.925353" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:41.925754" elapsed="0.000045"/>
</return>
<msg time="2026-04-11T01:01:41.925932" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:01:41.924188" elapsed="0.001769"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:01:41.931022" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:01:41.930814" elapsed="0.000238"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:41.931215" elapsed="0.000222"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:41.931813" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:41.931600" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.932458" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:41.932166" elapsed="0.000336"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:01:41.932660" elapsed="0.000186"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:41.933268" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:01:41.933047" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.933755" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:41.933501" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.934427" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:41.933961" elapsed="0.000495"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.934876" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:41.934632" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.935401" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:01:41.935081" elapsed="0.000353"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:41.942698" elapsed="0.000246"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:41.952019" elapsed="0.000216"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.952841" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:41.952419" elapsed="0.000450"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:41.954272" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.953724" elapsed="0.000720">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.954611" elapsed="0.000023"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.953149" elapsed="0.001588">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.954920" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.955098" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.955278" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.955470" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.955644" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.955813" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.955985" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.956166" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.956334" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.956633" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.956863" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.957088" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:41.956498" elapsed="0.000672"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.956426" elapsed="0.000772"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.957346" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.957421" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.951503" elapsed="0.006028">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.957601" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.940185" elapsed="0.017517">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.957948" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.962277" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.962529" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.962598" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.930222" elapsed="0.032484">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:41.962823" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:41.962867" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:41.929622" elapsed="0.033267"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.963110" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:41.962978" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:41.962957" elapsed="0.000219"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:01:41.964520" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.965204" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:01:41.964887" elapsed="0.000342"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:01:41.966038" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.965771" elapsed="0.000355">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.966190" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.965428" elapsed="0.000865">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.966495" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.966677" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.966859" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.967035" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.967207" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.967377" elapsed="0.000036"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.967565" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.967739" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.967906" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.968331" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.968528" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.968697" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:01:41.968038" elapsed="0.000752"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.967971" elapsed="0.000847"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.968963" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.969023" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.963957" elapsed="0.005234">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:01:41.969318" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:01:41.969363" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:41.963334" elapsed="0.006051"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.970038" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.969716" elapsed="0.000385">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:41.969489" elapsed="0.000680">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:41.969469" elapsed="0.000737">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.970253" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.928998" elapsed="0.041352">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.970550" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.970722" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.970783" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:01:41.926275" elapsed="0.044610">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.971058" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.971250" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.971446" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.971616" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.971787" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.971952" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.972014" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.923300" elapsed="0.048815">Could not parse owner and candidates for device openflow:1</status>
</kw>
<msg time="2026-04-11T01:01:41.972265" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.659775" elapsed="30.312584">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.972460" elapsed="0.000017"/>
</return>
<var>${original_owner}</var>
<var>${original_successor_list}</var>
<arg>openflow:1</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.657625" elapsed="30.314938">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${original_successor}</var>
<arg>${original_successor_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.972745" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.972928" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_successor_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.973121" elapsed="0.000023"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_successor}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.973472" elapsed="0.000022"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor for first switch s1.</doc>
<status status="FAIL" start="2026-04-11T01:01:11.637981" elapsed="30.335658">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</test>
<test id="s1-s4-t47" name="Check Switch Generates Slave Connection Before Owner Stop" line="331">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:01:41.977582" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:01:41.977242" elapsed="0.000622"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.978934" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:41.978795" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:41.978770" elapsed="0.000237"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.983936" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:41.983825" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:41.983806" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.985046" 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-11T01:01:41.984655" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.985610" 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-11T01:01:41.985291" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:41.985694" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T01:01:41.985856" 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-11T01:01:41.984240" elapsed="0.001641"/>
</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-11T01:01:41.986240" 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-11T01:01:41.986500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:01:41.986337" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:01:41.986320" elapsed="0.000258"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:01:41.986094" elapsed="0.000507"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.985936" elapsed="0.000692"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:01:41.983447" elapsed="0.003242"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:01:41.978488" elapsed="0.008256"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:41.978019" elapsed="0.008769"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:01:41.974753" elapsed="0.012087"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:01:41.991642" level="FAIL">Variable '${original_successor}' not found.</msg>
<var>${original_slave}</var>
<arg>${ODL_SYSTEM_${original_successor}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.987068" elapsed="0.004618">Variable '${original_successor}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>50s</arg>
<arg>1s</arg>
<arg>OvsManager.Should Be Slave</arg>
<arg>s1</arg>
<arg>${original_slave}</arg>
<arg>update_data=${True}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:41.991875" elapsed="0.000023"/>
</kw>
<doc>Check switch s1 is connected to Slave.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.974069" elapsed="0.017976">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s4-t48" name="Check Shards Status Before Owner Stop" line="342">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:01:41.995874" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:01:41.995557" elapsed="0.000596"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:41.997254" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:41.997114" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:41.997091" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.002505" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:42.002374" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:42.002355" elapsed="0.000218"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.003670" 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-11T01:01:42.003264" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.004285" 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-11T01:01:42.003901" elapsed="0.000412"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:42.004359" elapsed="0.000047"/>
</return>
<msg time="2026-04-11T01:01:42.004536" 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-11T01:01:42.002802" elapsed="0.001760"/>
</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-11T01:01:42.004913" 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-11T01:01:42.005167" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:01:42.005019" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:01:42.005000" elapsed="0.000271"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:01:42.004769" elapsed="0.000526"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.004616" elapsed="0.000724"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:01:42.001918" elapsed="0.003514"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:01:41.996761" elapsed="0.008728"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:41.996309" elapsed="0.009223"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:01:41.993063" elapsed="0.012521"/>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<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-11T01:01:42.028352" elapsed="0.000259"/>
</kw>
<msg time="2026-04-11T01:01:42.028670" 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-11T01:01:42.027671" elapsed="0.001054"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default', 'entity-ownership'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-11T01:01:42.027142" elapsed="0.001661"/>
</kw>
<msg time="2026-04-11T01:01:42.028852" 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-11T01:01:42.018006" elapsed="0.010890"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-11T01:01:42.017527" elapsed="0.011447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.029578" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:01:42.029262" elapsed="0.000364"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<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-11T01:01:42.035023" 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-11T01:01:42.034634" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.035523" 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-11T01:01:42.035213" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:42.035596" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T01:01:42.035753" 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-11T01:01:42.034208" elapsed="0.001569"/>
</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-11T01:01:42.035933" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.036600" level="INFO">${ds_type} = operational</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-11T01:01:42.036249" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.037024" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T01:01:42.036786" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.037482" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T01:01:42.037197" elapsed="0.000312"/>
</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-11T01:01:42.037906" 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-11T01:01:42.038165" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:01:42.038014" elapsed="0.000207"/>
</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-11T01:01:42.038434" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:01:42.038246" elapsed="0.000254"/>
</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-11T01:01:42.038676" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:01:42.038525" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:01:42.037995" elapsed="0.000757"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:01:42.037736" elapsed="0.001041"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.037557" elapsed="0.001245"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-11T01:01:42.038842" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:01:42.039045" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-11T01:01:42.039092" 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-11T01:01:42.033495" elapsed="0.005621"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.039825" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T01:01:42.039907" 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-11T01:01:42.039290" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.040537" 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-11T01:01:42.040229" elapsed="0.000379">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-11T01:01:42.040004" elapsed="0.000671">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-11T01:01:42.039985" elapsed="0.000723">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-11T01:01:42.040868" 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-11T01:01:42.041048" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.041115" elapsed="0.000017"/>
</return>
<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>
<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-11T01:01:42.030667" elapsed="0.010611">No leader found.</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-11T01:01:42.030434" elapsed="0.010916">No leader found.</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-11T01:01:42.030274" elapsed="0.011225">No leader found.</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-11T01:01:42.029859" elapsed="0.011735">No leader found.</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:42.041839" elapsed="0.000026"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T01:01:42.005806" elapsed="0.036152">No leader found.</status>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T01:01:41.992436" elapsed="0.049671">No leader found.</status>
</test>
<test id="s1-s4-t49" name="Stop Owner Instance" line="346">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:01:42.045850" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:01:42.045551" elapsed="0.000581"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.047217" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:42.047098" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:42.047078" 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-11T01:01:42.052087" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:42.051980" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:42.051962" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.053144" 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-11T01:01:42.052768" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.053685" 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-11T01:01:42.053361" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:42.053771" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T01:01:42.053931" 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-11T01:01:42.052379" elapsed="0.001578"/>
</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-11T01:01:42.054307" 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-11T01:01:42.054568" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:01:42.054421" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:01:42.054403" elapsed="0.000241"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:01:42.054163" elapsed="0.000504"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.054011" elapsed="0.000681"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:01:42.051626" elapsed="0.003119"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:01:42.046784" elapsed="0.008015"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:42.046287" elapsed="0.008557"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:01:42.043125" elapsed="0.011773"/>
</kw>
<kw name="Stop_Single_Member" owner="ClusterManagement">
<msg time="2026-04-11T01:01:42.059331" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Convenience keyword that stops the specified member of the cluster.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member}</doc>
<status status="FAIL" start="2026-04-11T01:01:42.055154" elapsed="0.004217">Variable '${original_owner}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_cluster_list}</arg>
<arg>${original_successor_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:42.059591" elapsed="0.000024"/>
</kw>
<doc>Stop Owner Instance and verify it is shutdown</doc>
<status status="FAIL" start="2026-04-11T01:01:42.042577" elapsed="0.017168">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s4-t50" name="Check Shards Status After Stop" line="351">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:01:42.063113" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:01:42.062845" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.064376" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:42.064265" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:42.064246" elapsed="0.000218"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.069418" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:42.069294" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:42.069276" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.070518" 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-11T01:01:42.070116" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.070995" 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-11T01:01:42.070706" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:42.071065" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:01:42.071218" 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-11T01:01:42.069732" elapsed="0.001510"/>
</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-11T01:01:42.071643" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:42.071904" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:01:42.071755" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:01:42.071737" elapsed="0.000241"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:01:42.071461" elapsed="0.000539"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.071294" elapsed="0.000731"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:01:42.068932" elapsed="0.003146"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:01:42.063978" elapsed="0.008154"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:42.063554" elapsed="0.008623"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:01:42.060628" elapsed="0.011600"/>
</kw>
<kw name="Check OpenFlow Shards Status After Cluster Event" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:01:42.076676" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Check Shards Status after some cluster event.</doc>
<status status="FAIL" start="2026-04-11T01:01:42.072448" elapsed="0.004271">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-11T01:01:42.060085" elapsed="0.016771">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s4-t51" name="Check Entity Owner Status And Find Owner and Successor After Stop" line="355">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:01:42.080186" elapsed="0.000247"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:01:42.079916" elapsed="0.000574"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.081538" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:42.081370" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:42.081350" elapsed="0.000313"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.086569" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:42.086455" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:42.086433" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.087676" 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-11T01:01:42.087247" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.088164" 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-11T01:01:42.087865" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:42.088300" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T01:01:42.088489" 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-11T01:01:42.086870" elapsed="0.001646"/>
</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-11T01:01:42.088877" 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-11T01:01:42.089129" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:01:42.088976" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:01:42.088959" elapsed="0.000247"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:01:42.088728" elapsed="0.000502"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.088572" elapsed="0.000683"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:01:42.086042" elapsed="0.003268"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:01:42.081068" elapsed="0.008297"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:42.080643" elapsed="0.008796"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:01:42.077756" elapsed="0.011739"/>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:01:42.103716" level="FAIL">Variable '${original_successor}' not found.</msg>
<var>${new_owner}</var>
<var>${new_successor_list}</var>
<arg>openflow:1</arg>
<arg>${original_successor}</arg>
<arg>${new_cluster_list}</arg>
<arg>after_stop=True</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T01:01:42.099599" elapsed="0.004159">Variable '${original_successor}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:01:42.103954" elapsed="0.000022"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor.</doc>
<status status="FAIL" start="2026-04-11T01:01:42.077053" elapsed="0.027057">Variable '${original_successor}' not found.</status>
</test>
<test id="s1-s4-t52" name="Check Stats Are Not Frozen After Owner Stop" line="364">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:01:42.107563" elapsed="0.000233"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:01:42.107277" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.108873" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:42.108742" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:42.108723" elapsed="0.000220"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.113990" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:01:42.113878" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T01:01:42.113855" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.115064" 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-11T01:01:42.114673" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:01:42.115558" 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-11T01:01:42.115254" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:01:42.115630" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:01:42.115782" 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-11T01:01:42.114283" elapsed="0.001523"/>
</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-11T01:01:42.116175" 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-11T01:01:42.116434" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:01:42.116271" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:01:42.116255" elapsed="0.000256"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:01:42.116024" elapsed="0.000511"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:01:42.115860" elapsed="0.000699"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:01:42.113468" elapsed="0.003193"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:01:42.108455" elapsed="0.008260"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:01:42.108006" elapsed="0.008753"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:01:42.105040" elapsed="0.011770"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:42.121651" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:42.117494" elapsed="0.004197">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:43.130656" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:43.122380" elapsed="0.008329">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:44.140350" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:44.131475" elapsed="0.009005">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:45.150535" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:45.141218" elapsed="0.009426">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:46.160205" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:46.151515" elapsed="0.008755">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:47.169647" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:47.160993" elapsed="0.008711">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:48.178168" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:48.170548" elapsed="0.007691">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:49.188458" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:49.178984" elapsed="0.009555">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:50.198025" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:50.189276" elapsed="0.008842">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:51.209588" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:51.198909" elapsed="0.010832">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:52.219321" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:52.210585" elapsed="0.008870">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:53.227128" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:53.220231" elapsed="0.006968">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:54.235636" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:54.228010" elapsed="0.007694">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:55.244944" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:55.236521" elapsed="0.008476">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:56.255000" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:56.245789" elapsed="0.009317">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:57.265208" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:57.255894" elapsed="0.009424">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:58.275615" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:58.266142" elapsed="0.009583">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:01:59.284953" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:01:59.276528" elapsed="0.008475">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:00.295856" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:00.285829" elapsed="0.010103">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:01.305866" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:01.296738" elapsed="0.009401">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:02.315562" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:02.306952" elapsed="0.008685">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:03.321857" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:03.316218" elapsed="0.005710">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:04.331678" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:04.322703" elapsed="0.009075">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:05.341417" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:05.332600" elapsed="0.008915">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:06.351752" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:06.342290" elapsed="0.009575">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:07.361479" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:07.352702" elapsed="0.008877">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:08.371121" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:08.362322" elapsed="0.008852">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:09.381518" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:09.371932" elapsed="0.009642">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:10.387662" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:10.382093" elapsed="0.005637">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:11.397219" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:11.388489" elapsed="0.008782">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<msg time="2026-04-11T01:02:12.407212" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:12.397953" elapsed="0.009333">Variable '${new_owner}' not found.</status>
</kw>
<msg time="2026-04-11T01:02:12.407451" level="FAIL">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Variable '${new_owner}' not found.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>Check Flow Stats Are Not Frozen</arg>
<arg>${new_owner}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:01:42.116993" elapsed="30.290659">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Variable '${new_owner}' not found.</status>
</kw>
<doc>Check that duration flow stat is increasing in new owner.</doc>
<status status="FAIL" start="2026-04-11T01:01:42.104485" elapsed="30.303417">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s4-t53" name="Remove Configuration In Owner and Verify After Owner Stop" line="368">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:02:12.412724" elapsed="0.000341"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:02:12.412324" elapsed="0.000822"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:02:12.414644" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:12.414447" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:12.414412" elapsed="0.000335"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:02:12.420780" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:12.420672" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:12.420653" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:12.421865" 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-11T01:02:12.421473" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:12.422345" 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-11T01:02:12.422055" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:12.422432" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T01:02:12.422591" 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-11T01:02:12.421076" elapsed="0.001554"/>
</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-11T01:02:12.422999" 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-11T01:02:12.423325" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:02:12.423175" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:02:12.423157" elapsed="0.000260"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:02:12.422850" elapsed="0.000592"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:12.422691" elapsed="0.000778"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:02:12.420296" elapsed="0.003227"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:02:12.414009" elapsed="0.009568"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:12.413364" elapsed="0.010258"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:02:12.409326" elapsed="0.014347"/>
</kw>
<kw name="Remove Single Group And Flow On Member">
<msg time="2026-04-11T01:02:12.427632" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Remove 1 group 1&amp;2 and 1 flow in every switch.</doc>
<status status="FAIL" start="2026-04-11T01:02:12.423844" elapsed="0.003827">Variable '${new_owner}' not found.</status>
</kw>
<doc>Remove 1 group 1&amp;2 and 1 flow in every switch.</doc>
<status status="FAIL" start="2026-04-11T01:02:12.408485" elapsed="0.019322">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s4-t54" name="Check Flows After Owner Stop In Operational DS" line="372">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:02:12.431298" elapsed="0.000248"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:02:12.431026" elapsed="0.000576"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:02:12.432591" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:12.432481" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:12.432461" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:02:12.437411" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:12.437286" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:12.437268" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:12.438469" 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-11T01:02:12.438075" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:12.438960" 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-11T01:02:12.438674" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:12.439030" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:02:12.439182" 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-11T01:02:12.437703" elapsed="0.001503"/>
</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-11T01:02:12.439562" 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-11T01:02:12.439803" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:02:12.439658" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:02:12.439642" elapsed="0.000235"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:02:12.439418" elapsed="0.000482"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:12.439257" elapsed="0.000667"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:02:12.436930" elapsed="0.003045"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:02:12.432179" elapsed="0.007849"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:12.431759" elapsed="0.008313"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:02:12.428667" elapsed="0.011455"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:12.444679" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:12.440843" elapsed="0.003913">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:13.454105" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:13.445672" elapsed="0.008489">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:14.464350" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:14.455144" elapsed="0.009273">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:15.474315" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:15.465308" elapsed="0.009165">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:16.484550" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:16.475484" elapsed="0.009140">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:17.495592" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:17.485667" elapsed="0.009990">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:18.505527" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:18.496608" elapsed="0.008974">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:19.516250" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:19.506549" elapsed="0.009817">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:20.525741" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:20.517433" elapsed="0.008380">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:21.536048" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:21.526788" elapsed="0.009370">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:22.546934" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:22.537183" elapsed="0.009859">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:23.558969" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:23.548250" elapsed="0.010905">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:24.569127" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:24.560162" elapsed="0.009064">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:25.577241" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:25.570499" elapsed="0.006817">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:26.588178" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:26.578654" elapsed="0.009635">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:27.598953" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:27.589263" elapsed="0.009793">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:28.608893" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:28.600082" elapsed="0.008908">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:29.616902" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:29.609930" elapsed="0.007037">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:30.624678" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:30.617746" elapsed="0.007036">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:31.634722" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:31.625760" elapsed="0.009284">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:32.644832" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:32.636103" elapsed="0.008815">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:33.654401" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:33.645985" elapsed="0.008476">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:34.666040" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:34.656127" elapsed="0.010182">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:35.674680" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:35.667365" elapsed="0.007388">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:36.683119" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:36.675733" elapsed="0.007456">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:37.693011" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:37.684214" elapsed="0.008893">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:38.701100" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:38.694091" elapsed="0.007079">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:39.710350" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:39.702233" elapsed="0.008184">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:40.718032" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:40.711064" elapsed="0.007068">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:41.725904" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:41.718902" elapsed="0.007071">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:42.734203" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:42.727083" elapsed="0.007195">Variable '${new_owner}' not found.</status>
</kw>
<msg time="2026-04-11T01:02:42.734468" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Variable '${new_owner}' not found.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Flows On Member</arg>
<arg>${less_flows}</arg>
<arg>${new_owner}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:02:12.440286" elapsed="30.294472">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Variable '${new_owner}' not found.</status>
</kw>
<doc>Check Flows in Operational DS in new owner.</doc>
<status status="FAIL" start="2026-04-11T01:02:12.428115" elapsed="30.306914">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s4-t55" name="Check Groups After Owner Stop In Operational DS" line="381">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:02:42.741291" elapsed="0.000452"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:02:42.740886" elapsed="0.000954"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:02:42.743453" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:42.743286" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:42.743256" elapsed="0.000274"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:02:42.748315" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:42.748207" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:42.748189" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:42.749560" 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-11T01:02:42.749007" elapsed="0.000581"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:42.750041" 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-11T01:02:42.749753" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:42.750111" elapsed="0.000034"/>
</return>
<msg time="2026-04-11T01:02:42.750271" 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-11T01:02:42.748629" elapsed="0.001667"/>
</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-11T01:02:42.750722" 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-11T01:02:42.750972" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:02:42.750822" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:02:42.750805" elapsed="0.000334"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:02:42.750570" elapsed="0.000593"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:42.750356" elapsed="0.000835"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:02:42.747849" elapsed="0.003398"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:02:42.742836" elapsed="0.008465"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:42.742072" elapsed="0.009272"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:02:42.737129" elapsed="0.014283"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:42.756178" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_groups}</arg>
<arg>${new_owner}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:42.752134" elapsed="0.004083">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:43.766228" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_groups}</arg>
<arg>${new_owner}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:43.757144" elapsed="0.009190">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:44.776558" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_groups}</arg>
<arg>${new_owner}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:44.767357" elapsed="0.009302">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:45.786763" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_groups}</arg>
<arg>${new_owner}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:45.777680" elapsed="0.009184">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:46.795052" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_groups}</arg>
<arg>${new_owner}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:46.787907" elapsed="0.007216">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:47.804959" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_groups}</arg>
<arg>${new_owner}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:47.796119" elapsed="0.008943">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:48.815306" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_groups}</arg>
<arg>${new_owner}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:48.806062" elapsed="0.009313">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:49.825609" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_groups}</arg>
<arg>${new_owner}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:49.816275" elapsed="0.009431">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:50.833575" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_groups}</arg>
<arg>${new_owner}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:50.826695" elapsed="0.006945">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:51.842772" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_groups}</arg>
<arg>${new_owner}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:51.834575" elapsed="0.008264">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:02:52.852073" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${less_groups}</arg>
<arg>${new_owner}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.843831" elapsed="0.008312">Variable '${new_owner}' not found.</status>
</kw>
<msg time="2026-04-11T01:02:52.852311" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Variable '${new_owner}' not found.</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Groups On Member</arg>
<arg>${less_groups}</arg>
<arg>${new_owner}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:02:42.751586" elapsed="10.100943">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Variable '${new_owner}' not found.</status>
</kw>
<doc>Check Groups in Operational DS in new owner.</doc>
<status status="FAIL" start="2026-04-11T01:02:42.736075" elapsed="10.116689">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s4-t56" name="Check Flows In Switch After Owner Stop" line="390">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:02:52.857441" elapsed="0.000342"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:02:52.857038" elapsed="0.000824"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.859313" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:52.859133" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:52.859101" elapsed="0.000341"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.864842" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:52.864734" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:52.864715" elapsed="0.000293"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.866033" 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-11T01:02:52.865644" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.866529" 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-11T01:02:52.866225" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:52.866600" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T01:02:52.866757" 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-11T01:02:52.865243" elapsed="0.001539"/>
</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-11T01:02:52.867144" 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-11T01:02:52.867406" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:02:52.867243" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:02:52.867226" elapsed="0.000260"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:02:52.866996" elapsed="0.000513"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.866839" elapsed="0.000696"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:02:52.864359" elapsed="0.003232"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:02:52.858719" elapsed="0.008927"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:52.858081" elapsed="0.009611"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:02:52.853960" elapsed="0.013785"/>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<msg time="2026-04-11T01:02:52.872035" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<arg>${less_flows}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-11T01:02:52.868006" elapsed="0.004069">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Check Flows in switch.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.853194" elapsed="0.019015">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s4-t57" name="Start Old Owner Instance" line="394">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:02:52.875371" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:02:52.875108" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.876667" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:52.876558" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:52.876539" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.881653" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:52.881546" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:52.881528" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.882714" 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-11T01:02:52.882319" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.883188" 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-11T01:02:52.882903" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:52.883259" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:02:52.883426" 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-11T01:02:52.881943" elapsed="0.001510"/>
</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-11T01:02:52.883804" 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-11T01:02:52.884048" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:02:52.883901" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:02:52.883885" elapsed="0.000278"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:02:52.883651" elapsed="0.000535"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.883504" elapsed="0.000707"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:02:52.881175" elapsed="0.003117"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:02:52.876246" elapsed="0.008101"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:52.875811" elapsed="0.008595"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:02:52.873010" elapsed="0.011450"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-04-11T01:02:52.888685" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.884685" elapsed="0.004037">Variable '${original_owner}' not found.</status>
</kw>
<doc>Start old Owner Instance and verify it is up.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.872525" elapsed="0.016326">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s4-t58" name="Check Entity Owner Status And Find Owner and Successor After Start Owner" line="398">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:02:52.892044" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:02:52.891782" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.893295" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:52.893186" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:52.893166" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.898299" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:52.898192" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:52.898174" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.899355" 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-11T01:02:52.898980" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.899854" 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-11T01:02:52.899570" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:52.899925" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T01:02:52.900075" 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-11T01:02:52.898605" elapsed="0.001495"/>
</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-11T01:02:52.900472" 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-11T01:02:52.900719" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:02:52.900568" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:02:52.900552" elapsed="0.000241"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:02:52.900312" elapsed="0.000504"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.900150" elapsed="0.000689"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:02:52.897833" elapsed="0.003058"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:02:52.892902" elapsed="0.008043"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:52.892486" elapsed="0.008502"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:02:52.889659" elapsed="0.011378"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.937124" 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-11T01:02:52.936749" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.937657" 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-11T01:02:52.937352" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:52.937729" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:02:52.937881" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:02:52.936360" elapsed="0.001545"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:02:52.942546" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:02:52.942343" elapsed="0.000230"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:52.942727" elapsed="0.000204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:52.943297" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:52.943090" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.943954" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:52.943525" elapsed="0.000471"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:52.944149" elapsed="0.000213"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:52.944743" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:52.944536" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.945196" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:52.944941" elapsed="0.000298"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.945753" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:52.945409" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.946188" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:52.945952" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.946685" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:52.946400" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:52.953271" elapsed="0.000324"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:52.962799" elapsed="0.000415"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.964077" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:52.963498" elapsed="0.000698"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:52.966543" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.966026" elapsed="0.000657">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.966774" elapsed="0.000048"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.964548" elapsed="0.002414">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.967302" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.967729" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.968225" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.968637" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.968989" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.969377" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.969723" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.970114" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.970498" elapsed="0.000027"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.971888" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.972914" elapsed="0.000053"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.973925" elapsed="0.000055"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:52.970820" elapsed="0.003210"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.970689" elapsed="0.003402"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.974293" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.974487" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.961992" elapsed="0.012610">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.974671" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.950972" elapsed="0.023799">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.974949" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.979676" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.979876" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.979942" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.941803" elapsed="0.038244">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:52.980157" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:52.980233" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:52.941240" elapsed="0.039018"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.980468" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:52.980340" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:52.980321" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:52.981835" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.982524" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:52.982197" elapsed="0.000354"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:52.983540" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.983070" elapsed="0.000558">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.983692" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.982733" elapsed="0.001063">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.983973" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.984149" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.984340" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.984543" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.984716" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.984882" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.985048" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.985219" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.985400" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.985661" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.985833" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.985997" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:52.985531" elapsed="0.000518"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.985467" elapsed="0.000608"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.986215" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.986273" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.981271" elapsed="0.005105">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:52.986502" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:52.986545" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:52.980686" elapsed="0.005882"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:02:52.987171" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.986861" elapsed="0.000369">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:02:52.986647" elapsed="0.000646">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:02:52.986629" elapsed="0.000696">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.987369" elapsed="0.000043"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.940696" elapsed="0.046802">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.987674" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.987885" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.987950" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:02:52.938203" elapsed="0.049847">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.988234" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.988442" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.988623" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.988786" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.988955" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:52.989121" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:52.989183" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.935707" elapsed="0.053574">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:54.021949" 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-11T01:02:54.021452" elapsed="0.000531"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:54.022477" 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-11T01:02:54.022163" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:54.022554" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T01:02:54.022731" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:02:54.021042" elapsed="0.001713"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:02:54.027478" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:02:54.027267" elapsed="0.000238"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:54.027672" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:54.028231" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:54.028024" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:54.028724" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:54.028466" elapsed="0.000299"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:54.028913" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:54.029465" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:54.029244" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:54.029905" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:54.029664" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:54.030541" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:54.030180" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:54.030974" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:54.030739" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:54.031471" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:54.031172" elapsed="0.000325"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:54.038202" elapsed="0.000318"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:54.047890" elapsed="0.000424"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:54.049177" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:54.048597" elapsed="0.000689"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:54.051774" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:54.051207" elapsed="0.000722">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:54.052028" elapsed="0.000054"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:54.049647" elapsed="0.002584">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.052609" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.053002" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.053508" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.053902" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.054256" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.054632" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.054946" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.055336" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.055688" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.057101" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.058119" elapsed="0.000053"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.059125" elapsed="0.000053"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:54.056010" elapsed="0.003216"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:54.055866" elapsed="0.003425"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.059519" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:54.059713" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:54.047056" elapsed="0.012773">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:54.059899" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:02:54.035909" elapsed="0.024092">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.060258" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.064969" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.065191" elapsed="0.000024"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:02:54.065262" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:54.026726" elapsed="0.038646">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:54.065508" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:54.065553" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:54.026140" elapsed="0.039436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:54.065812" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:54.065668" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:54.065646" elapsed="0.000234"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:54.067236" elapsed="0.000234"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:54.067951" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:54.067641" elapsed="0.000335"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:54.068923" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:54.068525" elapsed="0.000485">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:54.069071" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:54.068159" elapsed="0.001015">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.069348" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.069552" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.069728" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.069898" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.070063" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.070226" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.070405" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.070585" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.070747" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.071160" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.071375" elapsed="0.000035"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.071579" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:54.071027" elapsed="0.000608"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:54.070811" elapsed="0.000850"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.071803" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:54.071862" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:54.066690" elapsed="0.005276">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:54.072077" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:54.072119" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:54.066038" elapsed="0.006104"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:02:54.072778" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:02:54.072457" elapsed="0.000382">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:02:54.072221" elapsed="0.000679">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:02:54.072203" elapsed="0.000730">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:54.072978" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:54.025589" elapsed="0.047486">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.073252" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.073446" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:54.073512" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:02:54.023056" elapsed="0.050557">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.073786" elapsed="0.000031"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.073977" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.074148" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.074312" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.074504" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:54.074671" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:54.074732" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:02:54.020209" elapsed="0.054624">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:55.105990" 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-11T01:02:55.105516" elapsed="0.000507"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:55.106554" 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-11T01:02:55.106223" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:55.106631" elapsed="0.000045"/>
</return>
<msg time="2026-04-11T01:02:55.106811" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:02:55.105070" elapsed="0.001767"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:02:55.111748" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:02:55.111556" elapsed="0.000220"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:55.111932" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:55.112523" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:55.112288" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:55.113032" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:55.112761" elapsed="0.000314"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:55.113248" elapsed="0.000213"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:55.114016" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:55.113620" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:55.114501" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:55.114223" elapsed="0.000320"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:55.115263" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:55.114701" elapsed="0.000594"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:55.115737" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:55.115486" elapsed="0.000295"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:55.116226" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:55.115937" elapsed="0.000320"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:55.122878" elapsed="0.000329"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:55.132527" elapsed="0.000422"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:55.133815" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:55.133215" elapsed="0.000706"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:55.136323" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:55.135797" elapsed="0.000695">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:55.136593" elapsed="0.000054"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:55.134253" elapsed="0.002544">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.137142" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.137572" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.138108" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.138520" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.138883" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.139269" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.139603" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.139996" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.140306" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.141682" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.142696" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.143724" elapsed="0.000053"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:55.140644" elapsed="0.003181"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:55.140501" elapsed="0.003390"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.144096" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:55.144280" elapsed="0.000021"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:55.131723" elapsed="0.012718">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:55.144519" elapsed="0.000019"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:02:55.120552" elapsed="0.024090">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.144827" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.151001" elapsed="0.000035"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.151214" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:02:55.151281" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:55.110980" elapsed="0.040528">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:55.151639" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:55.151683" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:55.110377" elapsed="0.041329"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:55.151989" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:55.151797" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:55.151775" elapsed="0.000284"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:55.153653" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:55.154338" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:55.154023" elapsed="0.000341"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:55.155415" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:55.154909" elapsed="0.000614">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:55.155586" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:55.154567" elapsed="0.001124">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.155868" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.156041" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.156220" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.156406" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.156578" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.156744" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.156910" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.157080" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.157244" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.157532" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.157705" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.157866" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:55.157399" elapsed="0.000519"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:55.157312" elapsed="0.000633"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.158086" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:55.158144" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:55.152900" elapsed="0.005347">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:55.158359" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:55.158418" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:55.152216" elapsed="0.006227"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:02:55.159085" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:02:55.158749" elapsed="0.000396">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:02:55.158526" elapsed="0.000682">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:02:55.158507" elapsed="0.000733">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:55.159326" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:55.109807" elapsed="0.049634">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.159621" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.159789" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:55.159851" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:02:55.107199" elapsed="0.052750">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.160119" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.160300" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.160496" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.160668" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.160840" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:55.161006" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:55.161066" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:02:55.104136" elapsed="0.057028">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:56.231191" 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-11T01:02:56.230723" elapsed="0.000501"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:56.231731" 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-11T01:02:56.231414" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:56.231810" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:02:56.231984" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:02:56.230268" elapsed="0.001741"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:02:56.236848" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:02:56.236648" elapsed="0.000228"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:56.237034" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:56.237612" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:56.237397" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:56.238166" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:56.237902" elapsed="0.000308"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:56.238395" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:56.238965" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:56.238751" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:56.239435" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:56.239168" elapsed="0.000311"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:56.239998" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:56.239636" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:56.240458" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:56.240199" elapsed="0.000306"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:56.240970" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:56.240661" elapsed="0.000337"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:56.247886" elapsed="0.000300"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:56.257541" elapsed="0.000428"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:56.258892" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:56.258247" elapsed="0.000754"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:56.261401" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:56.260864" elapsed="0.000693">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:56.261655" elapsed="0.000050"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:56.259346" elapsed="0.002506">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.262210" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.262670" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.263152" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.263568" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.263920" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.264290" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.264621" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.265015" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.265347" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.266730" elapsed="0.000057"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.267754" elapsed="0.000057"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.268783" elapsed="0.000056"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:56.265691" elapsed="0.003199"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:56.265551" elapsed="0.003404"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.269159" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:56.269334" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:56.256730" elapsed="0.012774">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:56.269585" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:02:56.245489" elapsed="0.024201">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.269872" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.274539" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.274748" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:02:56.274816" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:56.236070" elapsed="0.038858">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:56.275043" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:56.275089" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:56.235482" elapsed="0.039632"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:56.275354" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:56.275203" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:56.275182" elapsed="0.000285"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:56.276990" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:56.277685" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:56.277356" elapsed="0.000356"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:56.278844" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:56.278238" elapsed="0.000694">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:56.278995" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:56.277897" elapsed="0.001201">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.279274" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.279470" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.279651" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.279821" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.279988" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.280192" elapsed="0.000157"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.280520" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.280694" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.280859" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.281116" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.281289" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.281469" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:56.280987" elapsed="0.000536"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:56.280923" elapsed="0.000627"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.281693" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:56.281751" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:56.276440" elapsed="0.005417">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:56.281967" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:56.282010" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:56.275668" elapsed="0.006364"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:02:56.282676" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:02:56.282343" elapsed="0.000394">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:02:56.282111" elapsed="0.000688">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:02:56.282093" elapsed="0.000738">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:56.282876" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:56.234894" elapsed="0.048082">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.283153" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.283322" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:56.283396" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:02:56.232314" elapsed="0.051184">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.283670" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.283849" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.284020" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.284183" elapsed="0.000053"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.284414" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:56.284586" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:56.284648" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:02:56.229431" elapsed="0.055317">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:57.315976" 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-11T01:02:57.315519" elapsed="0.000490"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:57.316495" 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-11T01:02:57.316182" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:57.316571" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T01:02:57.316745" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:02:57.315115" elapsed="0.001655"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:02:57.321469" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:02:57.321264" elapsed="0.000231"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:57.321651" elapsed="0.000200"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:57.322215" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:57.322008" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:57.322715" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:57.322456" elapsed="0.000301"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:57.322905" elapsed="0.000348"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:57.323635" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:57.323427" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:57.324073" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:57.323833" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:57.324622" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:57.324268" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:57.325049" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:57.324816" elapsed="0.000275"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:57.325535" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:57.325241" elapsed="0.000320"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:57.332174" elapsed="0.000322"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:57.341625" elapsed="0.000459"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:57.342945" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:57.342355" elapsed="0.000707"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:57.345424" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:57.344901" elapsed="0.000735">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:57.345750" elapsed="0.000059"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:57.343421" elapsed="0.002535">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.346306" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.346739" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.347212" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.347625" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.347980" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.348329" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.348662" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.349057" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.349400" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.350743" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.351756" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.352766" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:57.349736" elapsed="0.003131"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:57.349579" elapsed="0.003349"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.353127" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:57.353291" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:57.340851" elapsed="0.012569">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:57.353491" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:02:57.329886" elapsed="0.023705">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.353808" elapsed="0.000024"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.358369" elapsed="0.000160"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.358700" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:02:57.358767" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:57.320717" elapsed="0.038199">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:57.359030" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:57.359073" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:57.320134" elapsed="0.038962"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:57.359300" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:57.359184" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:57.359163" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:57.360689" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:57.361353" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:57.361053" elapsed="0.000340"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:57.362342" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:57.361945" elapsed="0.000660">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:57.362669" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:57.361589" elapsed="0.001183">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.362946" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.363120" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.363295" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.363481" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.363651" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.363815" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.363980" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.364150" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.364313" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.364585" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.364758" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.364919" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:57.364455" elapsed="0.000517"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:57.364377" elapsed="0.000620"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.365137" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:57.365195" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:57.360120" elapsed="0.005178">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:57.365422" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:57.365467" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:57.359536" elapsed="0.005954"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:02:57.366176" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:02:57.365860" elapsed="0.000376">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:02:57.365606" elapsed="0.000693">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:02:57.365587" elapsed="0.000744">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:57.366376" elapsed="0.000032"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:57.319574" elapsed="0.046920">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.366678" elapsed="0.000025"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.366851" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:57.366912" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:02:57.317075" elapsed="0.049936">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.367184" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.367363" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.367564" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.367728" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.367897" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:57.368063" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:57.368124" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:02:57.314331" elapsed="0.053890">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:58.403044" 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-11T01:02:58.402571" elapsed="0.000507"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:58.403563" 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-11T01:02:58.403250" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:58.403638" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:02:58.403810" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:02:58.402163" elapsed="0.001672"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:02:58.408759" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:02:58.408520" elapsed="0.000272"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:58.408951" elapsed="0.000229"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:58.409594" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:58.409347" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:58.410078" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:58.409823" elapsed="0.000297"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:58.410270" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:58.410824" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:58.410620" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:58.411296" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:58.411036" elapsed="0.000303"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:58.411866" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:58.411514" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:58.412299" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:58.412063" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:58.412804" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:58.412513" elapsed="0.000318"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:58.419623" elapsed="0.000296"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:58.429265" elapsed="0.000438"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:58.430557" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:58.429964" elapsed="0.000699"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:58.433032" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:58.432516" elapsed="0.000681">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:58.433290" elapsed="0.000049"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:58.430996" elapsed="0.002503">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.433849" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.434243" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.434744" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.435134" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.435507" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.435858" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.436177" elapsed="0.000027"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.436590" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.436918" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.438283" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.439431" elapsed="0.000063"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.440454" elapsed="0.000053"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:58.437336" elapsed="0.003220"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:58.437172" elapsed="0.003445"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.440818" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:58.440982" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:58.428488" elapsed="0.012607">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:58.441195" elapsed="0.000023"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:02:58.417287" elapsed="0.024017">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.441500" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.445919" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.446116" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:02:58.446183" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:58.407869" elapsed="0.038420">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:58.446538" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:58.446585" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:58.407296" elapsed="0.039312"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:58.446820" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:58.446701" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:58.446680" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:58.448207" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:58.448892" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:58.448588" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:58.449882" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:58.449476" elapsed="0.000496">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:58.450034" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:58.449101" elapsed="0.001036">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.450313" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.450652" elapsed="0.000056"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.450871" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.451044" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.451213" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.451393" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.451566" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.451739" elapsed="0.000159"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.452049" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.452316" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.452511" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.452677" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:58.452180" elapsed="0.000550"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:58.452115" elapsed="0.000640"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.452903" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:58.452963" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:58.447660" elapsed="0.005407">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:58.453204" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:58.453248" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:58.447042" elapsed="0.006228"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:02:58.453901" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:02:58.453583" elapsed="0.000378">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:02:58.453351" elapsed="0.000673">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:02:58.453333" elapsed="0.000723">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:58.454101" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:58.406744" elapsed="0.047455">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.454376" elapsed="0.000037"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.454563" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:58.454625" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:02:58.404207" elapsed="0.050515">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.454929" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.455109" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.455280" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.455473" elapsed="0.000025"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.455650" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:58.455817" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:58.455878" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:02:58.401372" elapsed="0.054604">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:02:59.488465" 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-11T01:02:59.487975" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:02:59.488998" 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-11T01:02:59.488700" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:02:59.489072" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T01:02:59.489246" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:02:59.487577" elapsed="0.001694"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:02:59.494196" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:02:59.494006" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:59.494378" elapsed="0.000212"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:59.494968" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:59.494755" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:59.495469" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:59.495195" elapsed="0.000316"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:02:59.495662" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:59.496467" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:02:59.496012" elapsed="0.000486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:59.496964" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:59.496709" elapsed="0.000296"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:59.497535" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:59.497165" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:02:59.497977" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:02:59.497734" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:02:59.498479" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:02:59.498174" elapsed="0.000331"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:59.505055" elapsed="0.000425"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:59.514665" elapsed="0.000411"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:59.515934" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:59.515335" elapsed="0.000706"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:59.518426" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:59.517903" elapsed="0.000676">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:59.518672" elapsed="0.000052"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:59.516371" elapsed="0.002501">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.519216" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.519652" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.520122" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.520541" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.520896" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.521245" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.521571" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.521968" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.522276" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.523598" elapsed="0.000053"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.524620" elapsed="0.000053"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.525636" elapsed="0.000058"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:59.522605" elapsed="0.003137"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:59.522466" elapsed="0.003339"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.526006" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:59.526169" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:59.513867" elapsed="0.012413">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:59.526348" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:02:59.502756" elapsed="0.023706">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.526641" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.531189" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.531562" elapsed="0.000024"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:02:59.531632" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:02:59.493457" elapsed="0.038286">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:59.531855" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:59.531898" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:59.492859" elapsed="0.039062"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:59.532132" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:02:59.532008" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-11T01:02:59.531987" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:02:59.533522" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:02:59.534185" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:02:59.533885" elapsed="0.000325"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:02:59.535144" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:02:59.534750" elapsed="0.000480">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:02:59.535292" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:02:59.534407" elapsed="0.001155">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.535743" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.535916" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.536092" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.536262" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.536444" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.536622" elapsed="0.000024"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.536792" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.536963" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.537124" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.537397" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.537573" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.537740" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:02:59.537251" elapsed="0.000542"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:02:59.537187" elapsed="0.000631"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.537960" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:59.538018" elapsed="0.000047"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:59.532967" elapsed="0.005192">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:02:59.538270" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:02:59.538314" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:02:59.532351" elapsed="0.005986"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:02:59.538968" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:02:59.538651" elapsed="0.000378">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:02:59.538434" elapsed="0.000658">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:02:59.538415" elapsed="0.000709">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:02:59.539170" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:02:59.492241" elapsed="0.047026">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.539462" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.539633" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:59.539695" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:02:59.489587" elapsed="0.050206">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.539964" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.540145" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.540317" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.540510" elapsed="0.000051"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.540715" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:02:59.540883" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:02:59.540952" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:02:59.486771" elapsed="0.054281">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:00.575920" 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-11T01:03:00.575444" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:00.576572" 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-11T01:03:00.576242" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:00.576652" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:03:00.576824" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:00.575044" elapsed="0.001806"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:00.581621" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:00.581427" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:00.581805" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:00.582362" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:00.582152" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:00.582869" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:00.582600" elapsed="0.000312"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:00.583062" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:00.583626" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:00.583415" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:00.584118" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:00.583838" elapsed="0.000323"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:00.584687" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:00.584316" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:00.585122" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:00.584884" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:00.585621" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:00.585319" elapsed="0.000329"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:00.592368" elapsed="0.000315"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:00.601950" elapsed="0.000422"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:00.603247" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:00.602655" elapsed="0.000699"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:00.605759" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:00.605234" elapsed="0.000684">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:00.606011" elapsed="0.000050"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:00.603705" elapsed="0.002504">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.606581" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.606981" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.607469" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.607871" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.608247" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.608621" elapsed="0.000056"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.608979" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.609375" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.609707" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.611056" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.612241" elapsed="0.000067"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.613288" elapsed="0.000056"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:00.610030" elapsed="0.003379"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:00.609889" elapsed="0.003585"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.613682" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:00.613849" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:00.601162" elapsed="0.012802">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:00.614034" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:00.590025" elapsed="0.024112">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.614319" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.618828" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.619025" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:00.619093" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:00.580862" elapsed="0.038339">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:00.619314" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:00.619359" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:00.580279" elapsed="0.039117"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:00.619608" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:00.619488" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:00.619466" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:00.621013" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:00.621733" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:00.621403" elapsed="0.000356"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:00.622752" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:00.622304" elapsed="0.000583">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:00.622957" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:00.621957" elapsed="0.001107">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.623243" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.623601" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.623784" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.623990" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.624169" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.624336" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.624522" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.624697" elapsed="0.001628"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.626510" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.626777" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.626953" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.627118" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:00.626644" elapsed="0.000528"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:00.626579" elapsed="0.000619"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.627340" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:00.627415" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:00.620463" elapsed="0.007060">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:00.627635" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:00.627680" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:00.619830" elapsed="0.007874"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:00.628364" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:00.628025" elapsed="0.000420">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:00.627785" elapsed="0.000725">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:00.627766" elapsed="0.000778">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:00.628591" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:00.579685" elapsed="0.049007">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.628880" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.629092" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:00.629159" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:00.577157" elapsed="0.052103">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.629449" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.629635" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.629811" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.629979" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.630152" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:00.630324" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:00.630402" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:00.574256" elapsed="0.056248">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:01.661812" 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-11T01:03:01.661256" elapsed="0.000592"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:01.662327" 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-11T01:03:01.662025" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:01.662419" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T01:03:01.662595" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:01.660862" elapsed="0.001758"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:01.667338" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:01.667148" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:01.667548" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:01.668107" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:01.667897" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:01.668594" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:01.668321" elapsed="0.000315"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:01.668790" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:01.669335" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:01.669127" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:01.669795" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:01.669549" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:01.670425" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:01.669989" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:01.671053" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:01.670625" elapsed="0.000474"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:01.671590" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:01.671255" elapsed="0.000361"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:01.678581" elapsed="0.000298"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:01.688125" elapsed="0.000510"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:01.689494" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:01.688902" elapsed="0.000698"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:01.692001" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:01.691481" elapsed="0.000669">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:01.692242" elapsed="0.000049"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:01.689930" elapsed="0.002527">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.692802" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.693195" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.693722" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.694117" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.694488" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.694841" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.695157" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.695579" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.695889" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.697135" elapsed="0.000053"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.698209" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.699240" elapsed="0.000063"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:01.696199" elapsed="0.003159"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:01.696062" elapsed="0.003540"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.699824" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:01.699992" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:01.687315" elapsed="0.012794">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:01.700180" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:01.676252" elapsed="0.024030">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.700529" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.705022" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.705219" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:01.705286" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:01.666599" elapsed="0.038807">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:01.705519" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:01.705562" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:01.666022" elapsed="0.039562"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:01.705795" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:01.705670" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:01.705650" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:01.707160" elapsed="0.000217"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:01.707971" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:01.707668" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:01.708974" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:01.708573" elapsed="0.000489">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:01.709123" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:01.708177" elapsed="0.001049">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.709422" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.709598" elapsed="0.000019"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.709777" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.709947" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.710113" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.710278" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.710460" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.710636" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.710799" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.711207" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.711447" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.711656" elapsed="0.000023"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:01.710925" elapsed="0.000823"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:01.710862" elapsed="0.000913"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.711922" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:01.711982" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:01.706618" elapsed="0.005468">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:01.712198" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:01.712242" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:01.706013" elapsed="0.006251"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:01.712897" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:01.712577" elapsed="0.000381">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:01.712344" elapsed="0.000677">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:01.712326" elapsed="0.000727">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:01.713099" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:01.665464" elapsed="0.047762">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.713424" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.713601" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:01.713663" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:01.662926" elapsed="0.050834">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.713931" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.714111" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.714281" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.714458" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.714630" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:01.714795" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:01.714856" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:01.660034" elapsed="0.054919">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:02.748137" 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-11T01:03:02.747658" elapsed="0.000511"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:02.748659" 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-11T01:03:02.748344" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:02.748734" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:03:02.748904" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:02.747247" elapsed="0.001682"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:02.753651" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:02.753460" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:02.753835" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:02.754403" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:02.754180" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:02.754882" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:02.754618" elapsed="0.000314"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:02.755082" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:02.755644" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:02.755434" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:02.756087" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:02.755842" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:02.756642" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:02.756283" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:02.757085" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:02.756847" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:02.757777" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:02.757283" elapsed="0.000521"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:02.764473" elapsed="0.000304"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:02.773962" elapsed="0.000438"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:02.775264" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:02.774669" elapsed="0.000701"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:02.777715" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:02.777194" elapsed="0.000670">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:02.777955" elapsed="0.000050"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:02.775718" elapsed="0.002429">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.778510" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.778933" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.779422" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.779817" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.780233" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.780599" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.780913" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.781305" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.781633" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.782950" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.783974" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.784990" elapsed="0.000053"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:02.781949" elapsed="0.003142"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:02.781811" elapsed="0.003343"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.785359" elapsed="0.000034"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:02.785545" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:02.773177" elapsed="0.012483">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:02.785729" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:02.762121" elapsed="0.023709">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.786009" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.790580" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.790778" elapsed="0.000047"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:02.790871" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:02.752897" elapsed="0.038080">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:02.791088" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:02.791131" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:02.752329" elapsed="0.038825"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:02.791356" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:02.791239" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:02.791218" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:02.792743" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:02.793640" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:02.793313" elapsed="0.000353"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:02.794802" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:02.794195" elapsed="0.000699">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:02.794957" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:02.793856" elapsed="0.001206">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.795240" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.795433" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.795615" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.795790" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.795958" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.796122" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.796288" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.796475" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.796642" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.797059" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.797231" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.797413" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:02.796924" elapsed="0.000545"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:02.796706" elapsed="0.000789"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.797638" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:02.797697" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:02.792181" elapsed="0.005624">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:02.797918" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:02.797961" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:02.791593" elapsed="0.006391"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:02.798609" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:02.798278" elapsed="0.000392">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:02.798064" elapsed="0.000669">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:02.798046" elapsed="0.000719">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:02.798850" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:02.751778" elapsed="0.047178">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.799176" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.799347" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:02.799439" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:02.749229" elapsed="0.050312">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.799713" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.799896" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.800069" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.800233" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.800418" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:02.800588" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:02.800650" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:02.746408" elapsed="0.054339">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:03.832598" 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-11T01:03:03.832101" elapsed="0.000532"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:03.833114" 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-11T01:03:03.832812" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:03.833193" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T01:03:03.833368" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:03.831699" elapsed="0.001710"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:03.838188" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:03.837996" elapsed="0.000225"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:03.838408" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:03.838976" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:03.838767" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:03.839474" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:03.839197" elapsed="0.000320"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:03.839667" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:03.840227" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:03.840002" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:03.840785" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:03.840532" elapsed="0.000298"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:03.841593" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:03.840992" elapsed="0.000635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:03.842049" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:03.841804" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:03.842599" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:03.842248" elapsed="0.000379"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:03.849483" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:03.859094" elapsed="0.000467"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:03.860439" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:03.859829" elapsed="0.000719"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:03.862948" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:03.862432" elapsed="0.000675">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:03.863203" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:03.860886" elapsed="0.002534">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.863769" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.864188" elapsed="0.000024"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.864739" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.865131" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.865511" elapsed="0.000036"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.865902" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.866223" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.866653" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.866963" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.868217" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.869296" elapsed="0.000053"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.870332" elapsed="0.000068"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:03.867281" elapsed="0.003169"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:03.867140" elapsed="0.003373"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.870712" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:03.870875" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:03.858293" elapsed="0.012694">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:03.871057" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:03.847137" elapsed="0.024059">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.871393" elapsed="0.000024"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.875809" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.876041" elapsed="0.000029"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:03.876131" elapsed="0.000021"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:03.837445" elapsed="0.038807">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:03.876366" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:03.876612" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:03.836868" elapsed="0.039778"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:03.876864" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:03.876742" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:03.876719" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:03.878246" elapsed="0.000244"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:03.878954" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:03.878649" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:03.879939" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:03.879522" elapsed="0.000508">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:03.880093" elapsed="0.000166"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:03.879163" elapsed="0.001189">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.880696" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.880903" elapsed="0.000025"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.881091" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.881268" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.881477" elapsed="0.000025"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.881656" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.881828" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.882032" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.882205" elapsed="0.000083"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.882591" elapsed="0.000025"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.882773" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.882938" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:03.882430" elapsed="0.000561"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:03.882339" elapsed="0.000678"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.883159" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:03.883219" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:03.877700" elapsed="0.005627">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:03.883456" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:03.883501" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:03.877084" elapsed="0.006441"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:03.884173" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:03.883850" elapsed="0.000386">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:03.883614" elapsed="0.000687">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:03.883590" elapsed="0.000745">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:03.884396" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:03.836297" elapsed="0.048206">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.884686" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.884857" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:03.884919" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:03.833718" elapsed="0.051302">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.885192" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.885374" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.885578" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.885745" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.885916" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:03.886086" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:03.886149" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:03.830863" elapsed="0.055438">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:04.920520" 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-11T01:03:04.919956" elapsed="0.000601"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:04.921032" 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-11T01:03:04.920732" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:04.921109" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T01:03:04.921283" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:04.919564" elapsed="0.001743"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:04.926045" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:04.925850" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:04.926227" elapsed="0.000212"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:04.926813" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:04.926602" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:04.927487" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:04.927032" elapsed="0.000497"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:04.927681" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:04.928221" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:04.928018" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:04.928680" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:04.928436" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:04.929215" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:04.928875" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:04.929665" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:04.929428" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:04.930165" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:04.929881" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:04.936903" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:04.946433" elapsed="0.000409"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:04.947702" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:04.947107" elapsed="0.000701"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:04.950164" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:04.949647" elapsed="0.000667">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:04.950423" elapsed="0.000050"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:04.948141" elapsed="0.002474">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.950962" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.951458" elapsed="0.000024"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.951926" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.952316" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.952688" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.953036" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.953347" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.953774" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.954089" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.955336" elapsed="0.000139"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.956434" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.957510" elapsed="0.000058"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:04.954416" elapsed="0.003203"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:04.954263" elapsed="0.003419"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.957926" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:04.958092" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:04.945622" elapsed="0.012583">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:04.958274" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:04.934492" elapsed="0.023881">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.958570" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.963103" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.963304" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:04.963372" elapsed="0.000161"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:04.925267" elapsed="0.038362">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:04.963741" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:04.963785" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:04.924707" elapsed="0.039101"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:04.964058" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:04.963938" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:04.963916" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:04.965545" elapsed="0.000218"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:04.966228" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:04.965929" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:04.967244" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:04.966798" elapsed="0.000535">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:04.967556" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:04.966453" elapsed="0.001212">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.967841" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.968017" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.968193" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.968364" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.968550" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.968715" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.968881" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.969051" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.969215" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.969486" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.969667" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.969862" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:04.969341" elapsed="0.000575"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:04.969278" elapsed="0.000664"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.970083" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:04.970141" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:04.964980" elapsed="0.005264">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:04.970354" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:04.970413" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:04.964283" elapsed="0.006155"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:04.971071" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:04.970733" elapsed="0.000425">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:04.970519" elapsed="0.000713">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:04.970500" elapsed="0.000802">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:04.971352" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:04.924140" elapsed="0.047330">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.971651" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.971819" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:04.971881" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:04.921623" elapsed="0.050354">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.972147" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.972326" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.972525" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.972691" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.972860" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:04.973026" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:04.973085" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:04.918752" elapsed="0.054437">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:06.006906" 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-11T01:03:06.006419" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:06.007447" 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-11T01:03:06.007132" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:06.007523" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T01:03:06.007698" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:06.006012" elapsed="0.001710"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:06.012427" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:06.012223" elapsed="0.000232"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:06.012610" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:06.013161" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:06.012954" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:06.013742" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:06.013478" elapsed="0.000312"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:06.013942" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:06.014499" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:06.014279" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:06.014937" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:06.014696" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:06.015487" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:06.015132" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:06.015919" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:06.015684" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:06.016415" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:06.016117" elapsed="0.000325"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:06.023172" elapsed="0.000330"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:06.032659" elapsed="0.000410"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:06.033948" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:06.033359" elapsed="0.000695"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:06.036420" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:06.035900" elapsed="0.000672">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:06.036663" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:06.034405" elapsed="0.002454">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.037208" elapsed="0.000034"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.037630" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.038104" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.038504" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.038855" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.039209" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.039596" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.039981" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.040286" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.041562" elapsed="0.000058"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.042585" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.043692" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:06.040613" elapsed="0.003181"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:06.040476" elapsed="0.003379"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.044053" elapsed="0.000060"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:06.044257" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:06.031878" elapsed="0.012493">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:06.044457" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:06.020828" elapsed="0.023730">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.044738" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.049119" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.049325" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:06.049406" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:06.011664" elapsed="0.037851">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:06.049627" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:06.049670" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:06.011095" elapsed="0.038598"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:06.049903" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:06.049782" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:06.049760" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:06.051262" elapsed="0.000429"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:06.052151" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:06.051848" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:06.053109" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:06.052715" elapsed="0.000481">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:06.053292" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:06.052359" elapsed="0.001054">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.053588" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.053762" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.053937" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.054107" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.054314" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.054500" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.054668" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.054839" elapsed="0.000160"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.055152" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.055461" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.055639" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.055803" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:06.055281" elapsed="0.000575"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:06.055217" elapsed="0.000664"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.056021" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:06.056080" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:06.050722" elapsed="0.005462">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:06.056294" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:06.056337" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:06.050120" elapsed="0.006239"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:06.057001" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:06.056686" elapsed="0.000376">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:06.056470" elapsed="0.000654">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:06.056450" elapsed="0.000706">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:06.057201" elapsed="0.000030"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:06.010546" elapsed="0.046775">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.057528" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.057701" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:06.057763" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:06.008020" elapsed="0.049842">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.058035" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.058217" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.058405" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.058613" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.058785" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:06.058952" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:06.059013" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:06.005179" elapsed="0.053934">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:07.092810" 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-11T01:03:07.092294" elapsed="0.000553"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:07.093324" 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-11T01:03:07.093030" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:07.093416" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T01:03:07.093591" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:07.091901" elapsed="0.001715"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:07.098288" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:07.098100" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:07.098485" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:07.099043" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:07.098835" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:07.099535" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:07.099258" elapsed="0.000319"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:07.099727" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:07.102227" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:07.100057" elapsed="0.002198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:07.102701" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:07.102449" elapsed="0.000295"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:07.103246" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:07.102899" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:07.103704" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:07.103460" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:07.104186" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:07.103903" elapsed="0.000309"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:07.110787" elapsed="0.000303"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:07.120249" elapsed="0.000444"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:07.121574" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:07.120979" elapsed="0.000701"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:07.124074" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:07.123567" elapsed="0.000656">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:07.124313" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:07.122064" elapsed="0.002459">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.124879" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.125277" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.125783" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.126174" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.126542" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.126890" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.127210" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.127618" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.127930" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.129184" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.130257" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.131270" elapsed="0.000055"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:07.128244" elapsed="0.003128"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:07.128107" elapsed="0.003341"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.131650" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:07.131813" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:07.119496" elapsed="0.012428">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:07.131993" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:07.108469" elapsed="0.023621">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.132267" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.136729" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.136927" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:07.137032" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:07.097556" elapsed="0.039583">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:07.137250" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:07.137293" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:07.096984" elapsed="0.040332"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:07.137673" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:07.137549" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:07.137526" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:07.139031" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:07.139715" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:07.139409" elapsed="0.000333"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:07.140682" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:07.140268" elapsed="0.000514">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:07.140845" elapsed="0.000166"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:07.139926" elapsed="0.001178">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.141287" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.141623" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.141806" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.141980" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.142149" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.142316" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.142497" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.142670" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.142833" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.143094" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.143267" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.143446" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:07.142965" elapsed="0.000535"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:07.142896" elapsed="0.000631"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.143671" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:07.143729" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:07.138492" elapsed="0.005342">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:07.143945" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:07.144029" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:07.137892" elapsed="0.006162"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:07.144683" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:07.144350" elapsed="0.000418">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:07.144136" elapsed="0.000700">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:07.144117" elapsed="0.000751">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:07.144914" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:07.096407" elapsed="0.048605">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.145190" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.145358" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:07.145438" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:07.093918" elapsed="0.051620">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.145710" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.145891" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.146064" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.146228" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.146422" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:07.146592" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:07.146654" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:07.091083" elapsed="0.055669">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:08.179850" 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-11T01:03:08.179346" elapsed="0.000538"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:08.180396" 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-11T01:03:08.180067" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:08.180474" elapsed="0.000051"/>
</return>
<msg time="2026-04-11T01:03:08.180655" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:08.178948" elapsed="0.001732"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:08.185490" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:08.185274" elapsed="0.000243"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:08.185673" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:08.186234" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:08.186024" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:08.186736" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:08.186478" elapsed="0.000301"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:08.186932" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:08.187493" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:08.187271" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:08.188138" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:08.187694" elapsed="0.000487"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:08.188732" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:08.188366" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:08.189170" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:08.188932" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:08.189668" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:08.189368" elapsed="0.000327"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:08.196419" elapsed="0.000300"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:08.205874" elapsed="0.000415"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:08.207156" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:08.206572" elapsed="0.000690"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:08.209641" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:08.209121" elapsed="0.000681">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:08.209903" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:08.207612" elapsed="0.002486">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.210466" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.210859" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.211330" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.211740" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.212091" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.212470" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.212784" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.213172" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.213500" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.214806" elapsed="0.000102"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.215875" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.216897" elapsed="0.000055"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:08.213807" elapsed="0.003197"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:08.213672" elapsed="0.003394"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.217266" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:08.217448" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:08.205107" elapsed="0.012455">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:08.217631" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:08.194096" elapsed="0.023635">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.217910" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.222489" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.222692" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:08.222758" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:08.184729" elapsed="0.038145">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:08.222988" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:08.223036" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:08.184138" elapsed="0.038922"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:08.223273" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:08.223146" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:08.223125" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:08.224669" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:08.225335" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:08.225034" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:08.226293" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:08.225900" elapsed="0.000656">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:08.226624" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:08.225560" elapsed="0.001168">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.226903" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.227120" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.227301" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.227657" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.227828" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.227995" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.228161" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.228352" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.228535" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.228793" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.228968" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.229136" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:08.228664" elapsed="0.000524"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:08.228600" elapsed="0.000614"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.229356" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:08.229431" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:08.224101" elapsed="0.005437">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:08.229648" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:08.229691" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:08.223509" elapsed="0.006205"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:08.230330" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:08.230011" elapsed="0.000397">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:08.229794" elapsed="0.000678">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:08.229775" elapsed="0.000730">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:08.230551" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:08.183580" elapsed="0.047069">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.230827" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.230997" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:08.231059" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:08.181059" elapsed="0.050098">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.231368" elapsed="0.000047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.231578" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.231752" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.231916" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.232091" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:08.232283" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:08.232346" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:08.178128" elapsed="0.054333">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:09.264813" 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-11T01:03:09.264297" elapsed="0.000551"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:09.265334" 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-11T01:03:09.265024" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:09.265427" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T01:03:09.265601" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:09.263895" elapsed="0.001731"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:09.270353" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:09.270162" elapsed="0.000231"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:09.270551" elapsed="0.000198"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:09.271112" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:09.270905" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:09.271600" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:09.271329" elapsed="0.000313"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:09.271805" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:09.272344" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:09.272141" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:09.273009" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:09.272557" elapsed="0.000493"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:09.273568" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:09.273207" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:09.274002" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:09.273765" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:09.274505" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:09.274198" elapsed="0.000334"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:09.281120" elapsed="0.000395"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:09.290675" elapsed="0.000418"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:09.291988" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:09.291355" elapsed="0.000741"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:09.294461" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:09.293942" elapsed="0.000673">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:09.294709" elapsed="0.000054"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:09.292443" elapsed="0.002468">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.295253" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.295692" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.296172" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.296587" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.296941" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.297291" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.297621" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.298010" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.298319" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.299669" elapsed="0.000055"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.300676" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.301689" elapsed="0.000056"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:09.298652" elapsed="0.003140"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:09.298513" elapsed="0.003341"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.302056" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:09.302220" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:09.289893" elapsed="0.012439">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:09.302416" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:09.278800" elapsed="0.023724">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.302701" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.307318" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.307729" elapsed="0.000024"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:09.307801" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:09.269590" elapsed="0.038317">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:09.308020" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:09.308064" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:09.269022" elapsed="0.039065"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:09.308297" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:09.308175" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:09.308154" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:09.309696" elapsed="0.000204"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:09.310359" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:09.310058" elapsed="0.000342"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:09.311665" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:09.310922" elapsed="0.000838">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:09.311827" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:09.310584" elapsed="0.001348">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.312113" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.312289" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.312483" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.312658" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.312825" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.312991" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.313156" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.313328" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.313507" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.313764" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.313935" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.314098" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:09.313636" elapsed="0.000514"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:09.313573" elapsed="0.000604"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.314318" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:09.314376" elapsed="0.000068"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:09.309135" elapsed="0.005404">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:09.314651" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:09.314696" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:09.308535" elapsed="0.006184"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:09.315359" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:09.315035" elapsed="0.000404">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:09.314801" elapsed="0.000703">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:09.314782" elapsed="0.000755">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:09.315584" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:09.268468" elapsed="0.047246">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.315898" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.316067" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:09.316129" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:09.265928" elapsed="0.050300">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.316425" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.316617" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.316791" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.316955" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.317124" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:09.317290" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:09.317351" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:09.263005" elapsed="0.054467">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:10.356675" 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-11T01:03:10.356199" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:10.357274" 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-11T01:03:10.356973" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:10.357350" elapsed="0.000056"/>
</return>
<msg time="2026-04-11T01:03:10.357538" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:10.355795" elapsed="0.001769"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:10.362851" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:10.362635" elapsed="0.000253"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:10.363132" elapsed="0.000665"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:10.364343" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:10.364044" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:10.365322" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:10.364667" elapsed="0.000712"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:10.365594" elapsed="0.000211"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:10.366238" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:10.365992" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:10.366925" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:10.366536" elapsed="0.000455"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:10.367825" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:10.367263" elapsed="0.000603"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:10.368520" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:10.368131" elapsed="0.000461"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:10.369276" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:10.368835" elapsed="0.000481"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:10.376578" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:10.386077" elapsed="0.000440"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:10.387792" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:10.386782" elapsed="0.001252"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:10.393581" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:10.392260" elapsed="0.001627">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:10.394095" elapsed="0.000115"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:10.388825" elapsed="0.005722">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.395361" elapsed="0.000188"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.396204" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.396687" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.397077" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.397445" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.397817" elapsed="0.000094"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.398212" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.398621" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.398934" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.400270" elapsed="0.000055"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.401293" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.402302" elapsed="0.000053"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:10.399264" elapsed="0.003156"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:10.399108" elapsed="0.003375"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.402690" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:10.402858" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:10.385304" elapsed="0.017671">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:10.403044" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:10.374236" elapsed="0.028919">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.403337" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.408073" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.408277" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:10.408343" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:10.362072" elapsed="0.046392">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:10.408588" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:10.408632" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:10.361505" elapsed="0.047150"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:10.408881" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:10.408748" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:10.408727" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:10.410308" elapsed="0.000228"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:10.411005" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:10.410694" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:10.412191" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:10.411786" elapsed="0.000546">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:10.412418" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:10.411226" elapsed="0.001300">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.412703" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.412879" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.413058" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.413230" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.413413" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.413583" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.413751" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.413925" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.414091" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.414353" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.414544" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.414709" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:10.414223" elapsed="0.000539"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:10.414157" elapsed="0.000632"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.414931" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:10.414991" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:10.409753" elapsed="0.005341">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:10.415218" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:10.415262" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:10.409102" elapsed="0.006183"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:10.415926" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:10.415606" elapsed="0.000381">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:10.415367" elapsed="0.000682">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:10.415348" elapsed="0.000734">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:10.416128" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:10.360829" elapsed="0.055397">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.416419" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.416631" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:10.416696" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:10.357865" elapsed="0.058932">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.416968" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.417149" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.417322" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.417515" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.417689" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:10.417856" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:10.417918" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:10.354759" elapsed="0.063259">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:11.449213" 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-11T01:03:11.448745" elapsed="0.000506"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:11.449736" 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-11T01:03:11.449438" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:11.449811" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:03:11.449980" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:11.448335" elapsed="0.001670"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:11.454713" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:11.454510" elapsed="0.000230"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:11.454894" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:11.455465" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:11.455239" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:11.455938" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:11.455681" elapsed="0.000299"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:11.456134" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:11.456692" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:11.456484" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:11.457130" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:11.456887" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:11.457803" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:11.457322" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:11.458252" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:11.458007" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:11.458792" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:11.458481" elapsed="0.000339"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:11.465662" elapsed="0.000296"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:11.475125" elapsed="0.000436"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:11.476420" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:11.475827" elapsed="0.000700"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:11.478875" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:11.478342" elapsed="0.000693">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:11.479128" elapsed="0.000053"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:11.476855" elapsed="0.002471">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.479690" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.480086" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.480616" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.481008" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.481359" elapsed="0.000035"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.481728" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.482042" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.482448" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.482776" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.484069" elapsed="0.000063"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.485345" elapsed="0.000090"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.486654" elapsed="0.000076"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:11.483091" elapsed="0.003701"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:11.482951" elapsed="0.003938"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.487165" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:11.487377" elapsed="0.000043"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:11.474306" elapsed="0.013262">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:11.487664" elapsed="0.000021"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:11.463203" elapsed="0.024598">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.488090" elapsed="0.000029"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.493188" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.493442" elapsed="0.000026"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:11.493517" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:11.453956" elapsed="0.039671">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:11.493757" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:11.493803" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:11.453402" elapsed="0.040424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:11.494055" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:11.493920" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:11.493897" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:11.495719" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:11.496582" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:11.496096" elapsed="0.000515"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:11.497596" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:11.497146" elapsed="0.000553">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:11.497762" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:11.496801" elapsed="0.001067">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.498046" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.498222" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.498424" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.498637" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.498812" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.498981" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.499149" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.499323" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.499520" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.499953" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.500128" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.500294" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:11.499819" elapsed="0.000593"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:11.499591" elapsed="0.000859"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.500601" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:11.500663" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:11.495123" elapsed="0.005646">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:11.500883" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:11.500928" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:11.494280" elapsed="0.006671"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:11.501603" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:11.501252" elapsed="0.000414">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:11.501033" elapsed="0.000698">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:11.501014" elapsed="0.000749">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:11.501809" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:11.452836" elapsed="0.049071">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.502088" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.502260" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:11.502323" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:11.450308" elapsed="0.052137">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.502649" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.502837" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.503011" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.503178" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.503349" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:11.503549" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:11.503616" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:11.447517" elapsed="0.056202">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:12.536376" 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-11T01:03:12.535877" elapsed="0.000550"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:12.536906" 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-11T01:03:12.536605" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:12.536982" elapsed="0.000045"/>
</return>
<msg time="2026-04-11T01:03:12.537160" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:12.535455" elapsed="0.001730"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:12.541891" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:12.541700" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:12.542071" elapsed="0.000219"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:12.542675" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:12.542462" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:12.543146" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:12.542894" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:12.543335" elapsed="0.000195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:12.543924" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:12.543683" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:12.544605" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:12.544137" elapsed="0.000511"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:12.545151" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:12.544806" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:12.545602" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:12.545350" elapsed="0.000297"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:12.546081" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:12.545799" elapsed="0.000322"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:12.552915" elapsed="0.000323"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:12.563046" elapsed="0.000505"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:12.564461" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:12.563842" elapsed="0.000727"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:12.567008" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:12.566490" elapsed="0.000666">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:12.567257" elapsed="0.000054"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:12.564952" elapsed="0.002546">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.567843" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.568241" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.568736" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.569131" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.569575" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.569928" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.570260" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.570672" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.570987" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.572341" elapsed="0.000070"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.573416" elapsed="0.000062"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.574480" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:12.571331" elapsed="0.003253"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:12.571164" elapsed="0.003485"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.574857" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:12.575027" elapsed="0.000020"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:12.561959" elapsed="0.013237">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:12.575280" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:12.550593" elapsed="0.025053">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.575836" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.580472" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.580678" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:12.580745" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:12.541141" elapsed="0.039721">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:12.581000" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:12.581046" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:12.540584" elapsed="0.040485"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:12.581306" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:12.581166" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:12.581142" elapsed="0.000230"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:12.582840" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:12.583939" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:12.583284" elapsed="0.000681"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:12.587109" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:12.584531" elapsed="0.002690">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:12.587297" elapsed="0.000024"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:12.584155" elapsed="0.003295">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.587666" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.587843" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.588021" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.588195" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.588363" elapsed="0.000037"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.588551" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.588718" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.588893" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.589082" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.589368" elapsed="0.000037"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.589564" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.589729" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:12.589234" elapsed="0.000549"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:12.589159" elapsed="0.000651"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.589953" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:12.590012" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:12.582256" elapsed="0.007876">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:12.590255" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:12.590300" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:12.581551" elapsed="0.008772"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:12.591025" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:12.590669" elapsed="0.000421">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:12.590426" elapsed="0.000727">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:12.590404" elapsed="0.000780">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:12.591230" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:12.540019" elapsed="0.051309">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.591588" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.591760" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:12.591823" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:12.537504" elapsed="0.054418">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.592096" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.592283" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.592487" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.592687" elapsed="0.000026"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.592874" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:12.593043" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:12.593105" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:12.534527" elapsed="0.058680">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:13.625744" 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-11T01:03:13.625120" elapsed="0.000664"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:13.626342" 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-11T01:03:13.626002" elapsed="0.000394"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:13.626463" elapsed="0.000052"/>
</return>
<msg time="2026-04-11T01:03:13.626679" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:13.624629" elapsed="0.002080"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:13.631554" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:13.631344" elapsed="0.000238"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:13.631739" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:13.632322" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:13.632088" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:13.632820" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:13.632562" elapsed="0.000301"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:13.633014" elapsed="0.000420"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:13.633829" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:13.633614" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:13.634358" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:13.634103" elapsed="0.000314"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:13.634920" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:13.634574" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:13.635357" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:13.635119" elapsed="0.000298"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:13.635857" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:13.635572" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:13.642533" elapsed="0.000300"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:13.652116" elapsed="0.000446"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:13.653437" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:13.652830" elapsed="0.000715"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:13.656002" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:13.655481" elapsed="0.000673">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:13.656254" elapsed="0.000053"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:13.653897" elapsed="0.002579">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.656821" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.657226" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.657746" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.658138" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.658510" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.658861" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.659181" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.659593" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.659939" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.661354" elapsed="0.000089"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.662546" elapsed="0.000058"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.663571" elapsed="0.000055"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:13.660262" elapsed="0.003414"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:13.660120" elapsed="0.003616"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.663940" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:13.664104" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:13.651282" elapsed="0.012936">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:13.664289" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:13.640198" elapsed="0.024429">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.664811" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.669345" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.669563" elapsed="0.000034"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:13.669644" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:13.630789" elapsed="0.038963">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:13.669868" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:13.669912" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:13.630199" elapsed="0.039736"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:13.670162" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:13.670029" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:13.670007" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:13.671572" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:13.672247" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:13.671940" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:13.673623" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:13.673007" elapsed="0.000712">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:13.673785" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:13.672662" elapsed="0.001230">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.674074" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.674253" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.674475" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.674664" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.674838" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.675007" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.675178" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.675352" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.675538" elapsed="0.000055"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.675859" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.676041" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.676207" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:13.675708" elapsed="0.000553"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:13.675641" elapsed="0.000647"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.676467" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:13.676533" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:13.671008" elapsed="0.005633">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:13.676754" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:13.676799" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:13.670397" elapsed="0.006426"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:13.677460" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:13.677123" elapsed="0.000400">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:13.676905" elapsed="0.000696">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:13.676886" elapsed="0.000750">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:13.677682" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:13.629642" elapsed="0.048138">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.677959" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.678128" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:13.678195" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:13.627072" elapsed="0.051222">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.678493" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.678677" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.678849" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.679015" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.679186" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:13.679412" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:13.679497" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:13.623559" elapsed="0.056088">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:14.712750" 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-11T01:03:14.712244" elapsed="0.000541"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:14.713273" 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-11T01:03:14.712961" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:14.713351" elapsed="0.000059"/>
</return>
<msg time="2026-04-11T01:03:14.713546" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:14.711846" elapsed="0.001725"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:14.718278" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:14.718091" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:14.718477" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:14.719037" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:14.718828" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:14.719532" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:14.719258" elapsed="0.000317"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:14.719728" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:14.720507" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:14.720064" elapsed="0.000471"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:14.720962" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:14.720712" elapsed="0.000293"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:14.721572" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:14.721203" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:14.722014" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:14.721773" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:14.722513" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:14.722212" elapsed="0.000328"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:14.729333" elapsed="0.000321"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:14.738920" elapsed="0.000409"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:14.740182" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:14.739609" elapsed="0.000678"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:14.742671" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:14.742133" elapsed="0.000683">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:14.742910" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:14.740631" elapsed="0.002473">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.743479" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.743971" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.744455" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.744853" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.745294" elapsed="0.000024"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.745666" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.745985" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.746378" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.746721" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.748118" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.749144" elapsed="0.000059"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.750173" elapsed="0.000056"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:14.747040" elapsed="0.003237"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:14.746895" elapsed="0.003445"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.750575" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:14.750739" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:14.738133" elapsed="0.012729">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:14.750932" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:14.726998" elapsed="0.024034">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.751211" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.755868" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.756066" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:14.756131" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:14.717550" elapsed="0.038687">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:14.756350" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:14.756409" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:14.716941" elapsed="0.039492"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:14.756690" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:14.756563" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:14.756540" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:14.758103" elapsed="0.000234"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:14.758850" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:14.758536" elapsed="0.000340"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:14.759975" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:14.759423" elapsed="0.000644">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:14.760129" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:14.759059" elapsed="0.001175">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.760436" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.760615" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.760793" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.760965" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.761146" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.761318" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.761502" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.761674" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.761838" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.762094" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.762266" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.762444" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:14.761964" elapsed="0.000533"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:14.761901" elapsed="0.000623"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.762665" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:14.762723" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:14.757558" elapsed="0.005269">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:14.762937" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:14.762981" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:14.756912" elapsed="0.006092"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:14.763632" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:14.763298" elapsed="0.000394">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:14.763083" elapsed="0.000671">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:14.763065" elapsed="0.000757">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:14.763872" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:14.716368" elapsed="0.047603">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.764151" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.764320" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:14.764413" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:14.713873" elapsed="0.050645">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.764692" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.764896" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.765113" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.765282" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.765478" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:14.765648" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:14.765708" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:14.711017" elapsed="0.054791">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:15.798483" 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-11T01:03:15.797978" elapsed="0.000540"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:15.799002" 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-11T01:03:15.798697" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:15.799098" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T01:03:15.799277" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:15.797579" elapsed="0.001724"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:15.804071" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:15.803881" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:15.804253" elapsed="0.000207"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:15.804840" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:15.804630" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:15.805634" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:15.805147" elapsed="0.000532"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:15.805837" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:15.806415" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:15.806185" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:15.806871" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:15.806620" elapsed="0.000293"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:15.807436" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:15.807072" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:15.807909" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:15.807658" elapsed="0.000297"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:15.808435" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:15.808112" elapsed="0.000351"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:15.815085" elapsed="0.000331"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:15.824737" elapsed="0.000424"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:15.826035" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:15.825451" elapsed="0.000692"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:15.828560" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:15.827998" elapsed="0.000714">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:15.828806" elapsed="0.000054"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:15.826496" elapsed="0.002515">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.829356" elapsed="0.000058"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.829783" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.830276" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.830699" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.831053" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.831419" elapsed="0.000023"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.831739" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.832130" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.832496" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.833942" elapsed="0.000058"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.834991" elapsed="0.000056"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.836031" elapsed="0.000058"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:15.832830" elapsed="0.003307"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:15.832691" elapsed="0.003507"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.836430" elapsed="0.000059"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:15.836660" elapsed="0.000020"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:15.823903" elapsed="0.012875">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:15.836849" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:15.812795" elapsed="0.024173">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.837173" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.841905" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.842104" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:15.842170" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:15.803319" elapsed="0.038957">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:15.842402" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:15.842448" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:15.802763" elapsed="0.039709"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:15.842677" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:15.842559" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:15.842537" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:15.844049" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:15.844766" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:15.844446" elapsed="0.000346"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:15.845746" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:15.845323" elapsed="0.000512">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:15.845898" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:15.844976" elapsed="0.001026">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.846178" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.846353" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.846560" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.846735" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.846941" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.847112" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.847287" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.847478" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.847649" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.847906" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.848078" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.848241" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:15.847775" elapsed="0.000518"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:15.847713" elapsed="0.000606"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.848475" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:15.848558" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:15.843507" elapsed="0.005160">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:15.848778" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:15.848821" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:15.842895" elapsed="0.005949"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:15.849491" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:15.849140" elapsed="0.000414">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:15.848924" elapsed="0.000694">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:15.848906" elapsed="0.000745">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:15.849698" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:15.802187" elapsed="0.047609">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.849976" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.850147" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:15.850209" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:15.799630" elapsed="0.050683">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.850514" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.850698" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.850901" elapsed="0.000024"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.851126" elapsed="0.000022"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.851307" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:15.851509" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:15.851584" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:15.796735" elapsed="0.054972">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:16.883640" 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-11T01:03:16.883159" elapsed="0.000516"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:16.884157" 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-11T01:03:16.883850" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:16.884232" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:03:16.884416" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:16.882772" elapsed="0.001671"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:16.889094" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:16.888907" elapsed="0.000213"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:16.889277" elapsed="0.000206"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:16.889851" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:16.889642" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:16.890322" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:16.890068" elapsed="0.000295"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:16.890529" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:16.891068" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:16.890864" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:16.891527" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:16.891268" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:16.892080" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:16.891720" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:16.892541" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:16.892277" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:16.893015" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:16.892736" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:16.899730" elapsed="0.000313"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:16.909129" elapsed="0.000443"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:16.910425" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:16.909836" elapsed="0.000699"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:16.913022" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:16.912517" elapsed="0.000668">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:16.913292" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:16.910924" elapsed="0.002600">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.913911" elapsed="0.000026"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.914329" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.914844" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.915236" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.915613" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.915975" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.916312" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.916720" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.917031" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.918297" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.919458" elapsed="0.000053"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.920465" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:16.917351" elapsed="0.003215"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:16.917204" elapsed="0.003423"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.920830" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:16.920991" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:16.908370" elapsed="0.012732">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:16.921171" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:16.897427" elapsed="0.023845">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.921477" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.925858" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.926055" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:16.926176" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:16.888346" elapsed="0.037939">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:16.926600" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:16.926646" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:16.887775" elapsed="0.038894"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:16.926873" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:16.926757" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:16.926736" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:16.928264" elapsed="0.000226"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:16.928947" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:16.928647" elapsed="0.000326"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:16.929901" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:16.929506" elapsed="0.000482">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:16.930051" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:16.929154" elapsed="0.000999">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.930332" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.930537" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.930716" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.930888" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.931057" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.931222" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.931403" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.931577" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.931741" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.932156" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.932329" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.932511" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:16.932021" elapsed="0.000543"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:16.931804" elapsed="0.000786"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.932732" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:16.932790" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:16.927699" elapsed="0.005195">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:16.933003" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:16.933086" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:16.927091" elapsed="0.006019"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:16.933736" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:16.933422" elapsed="0.000375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:16.933191" elapsed="0.000668">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:16.933173" elapsed="0.000718">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:16.933937" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:16.887208" elapsed="0.046825">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.934212" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.934408" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:16.934476" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:16.884742" elapsed="0.049831">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.934743" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.934922" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.935092" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.935255" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.935456" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:16.935627" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:16.935687" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:16.881987" elapsed="0.053797">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:17.970909" 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-11T01:03:17.970411" elapsed="0.000534"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:17.971446" 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-11T01:03:17.971124" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:17.971532" elapsed="0.000048"/>
</return>
<msg time="2026-04-11T01:03:17.971712" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:17.969999" elapsed="0.001737"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:17.976555" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:17.976350" elapsed="0.000232"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:17.976737" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:17.977323" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:17.977108" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:17.977818" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:17.977560" elapsed="0.000300"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:17.978032" elapsed="0.000186"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:17.978607" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:17.978395" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:17.979228" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:17.978805" elapsed="0.000476"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:17.979829" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:17.979465" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:17.980268" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:17.980029" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:17.980826" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:17.980504" elapsed="0.000349"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:17.987427" elapsed="0.000362"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:17.997334" elapsed="0.000448"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:17.998675" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:17.998053" elapsed="0.000732"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:18.001216" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:18.000670" elapsed="0.000741">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:18.001517" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:17.999137" elapsed="0.002604">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.002164" elapsed="0.000029"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.002630" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.003112" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.003545" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.003900" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.004247" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.004577" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.004965" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.005278" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.006580" elapsed="0.000090"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.007708" elapsed="0.000056"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.008846" elapsed="0.000056"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:18.005621" elapsed="0.003334"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:18.005483" elapsed="0.003547"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.009238" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:18.009439" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:17.996578" elapsed="0.012978">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:18.009626" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:17.985131" elapsed="0.024595">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.009907" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.014623" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.014832" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:18.014900" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:17.975808" elapsed="0.039203">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:18.015124" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:18.015168" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:17.975203" elapsed="0.039989"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:18.015423" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:18.015282" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:18.015260" elapsed="0.000248"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:18.016876" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:18.017579" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:18.017245" elapsed="0.000361"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:18.018697" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:18.018133" elapsed="0.000654">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:18.018851" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:18.017791" elapsed="0.001164">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.019133" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.019365" elapsed="0.000049"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.019614" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.019790" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.019958" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.020124" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.020292" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.020502" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.020674" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.020932" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.021106" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.021269" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:18.020802" elapsed="0.000521"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:18.020739" elapsed="0.000609"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.021531" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:18.021608" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:18.016313" elapsed="0.005405">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:18.021833" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:18.021877" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:18.015700" elapsed="0.006200"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:18.022544" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:18.022201" elapsed="0.000405">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:18.021982" elapsed="0.000687">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:18.021963" elapsed="0.000739">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:18.022749" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:17.974651" elapsed="0.048197">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.023029" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.023200" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:18.023262" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:17.972159" elapsed="0.051201">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.023615" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.023800" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.023974" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.024138" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.024308" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:18.024500" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:18.024567" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:17.969170" elapsed="0.055498">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:19.056478" 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-11T01:03:19.055990" elapsed="0.000528"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:19.057066" 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-11T01:03:19.056726" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:19.057143" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T01:03:19.057323" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:19.055570" elapsed="0.001779"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:19.064262" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:19.064072" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:19.064458" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:19.065010" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:19.064805" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:19.065496" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:19.065222" elapsed="0.000316"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:19.065688" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:19.066230" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:19.066023" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:19.066684" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:19.066441" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:19.067229" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:19.066878" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:19.067693" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:19.067442" elapsed="0.000304"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:19.068191" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:19.067899" elapsed="0.000318"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:19.074777" elapsed="0.000377"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:19.084321" elapsed="0.000442"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:19.085615" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:19.085027" elapsed="0.000694"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:19.088056" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:19.087551" elapsed="0.000652">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:19.088296" elapsed="0.000051"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:19.086047" elapsed="0.002475">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.088864" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.089265" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.089769" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.090160" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.090529" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.090882" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.091207" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.091614" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.091925" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.093186" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.094344" elapsed="0.000070"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.095373" elapsed="0.000069"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:19.092234" elapsed="0.003256"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:19.092097" elapsed="0.003454"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.095752" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:19.095912" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:19.083573" elapsed="0.012451">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:19.096093" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:19.072505" elapsed="0.023688">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.096372" elapsed="0.000047"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.100987" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.101224" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:19.101291" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:19.063352" elapsed="0.038241">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:19.101709" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:19.101752" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:19.062780" elapsed="0.038995"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:19.101989" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:19.101863" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:19.101842" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:19.103373" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:19.104054" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:19.103753" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:19.105012" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:19.104616" elapsed="0.000482">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:19.105161" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:19.104262" elapsed="0.001001">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.105464" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.105638" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.105813" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.105985" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.106154" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.106320" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.106503" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.106679" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.106844" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.107129" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.107303" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.107480" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:19.106995" elapsed="0.000540"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:19.106907" elapsed="0.000653"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.107702" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:19.107759" elapsed="0.000049"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:19.102818" elapsed="0.005085">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:19.108013" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:19.108056" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:19.102211" elapsed="0.005867"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:19.108706" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:19.108373" elapsed="0.000393">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:19.108158" elapsed="0.000671">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:19.108140" elapsed="0.000721">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:19.108907" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:19.062207" elapsed="0.046798">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.109181" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.109349" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:19.109447" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:19.057679" elapsed="0.051869">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.109720" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.109898" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.110068" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.110230" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.110422" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:19.110592" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:19.110652" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:19.054690" elapsed="0.056059">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:20.144034" 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-11T01:03:20.143559" elapsed="0.000508"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:20.144624" 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-11T01:03:20.144310" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:20.144699" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:03:20.144867" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:20.143103" elapsed="0.001789"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:20.149645" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:20.149438" elapsed="0.000237"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:20.149829" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:20.150377" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:20.150170" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:20.150878" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:20.150626" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:20.151068" elapsed="0.000177"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:20.151617" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:20.151413" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:20.152052" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:20.151812" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:20.152600" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:20.152248" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:20.153024" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:20.152793" elapsed="0.000275"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:20.153515" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:20.153220" elapsed="0.000321"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:20.160313" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:20.169844" elapsed="0.000419"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:20.171129" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:20.170558" elapsed="0.000676"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:20.173605" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:20.173069" elapsed="0.000684">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:20.173845" elapsed="0.000050"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:20.171584" elapsed="0.002455">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.174378" elapsed="0.000050"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.174806" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.175273" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.175694" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.176049" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.176411" elapsed="0.000057"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.176766" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.177159" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.177500" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.178904" elapsed="0.000055"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.179924" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.180927" elapsed="0.000055"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:20.177814" elapsed="0.003217"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:20.177678" elapsed="0.003416"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.181295" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:20.181494" elapsed="0.000019"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:20.169055" elapsed="0.012553">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:20.181678" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:20.157964" elapsed="0.023814">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.181958" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.186614" elapsed="0.000031"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.186818" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:20.186885" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:20.148882" elapsed="0.038111">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:20.187105" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:20.187150" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:20.148284" elapsed="0.038889"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:20.187375" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:20.187259" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:20.187239" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:20.188795" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:20.189495" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:20.189163" elapsed="0.000359"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:20.190491" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:20.190047" elapsed="0.000568">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:20.190679" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:20.189706" elapsed="0.001079">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.190960" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.191134" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.191311" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.191505" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.191674" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.191839" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.192005" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.192176" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.192341" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.192616" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.192790" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.192953" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:20.192486" elapsed="0.000520"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:20.192421" elapsed="0.000611"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.193175" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:20.193234" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:20.188217" elapsed="0.005121">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:20.193465" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:20.193509" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:20.187616" elapsed="0.005917"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:20.194325" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:20.193827" elapsed="0.000584">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:20.193613" elapsed="0.000873">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:20.193595" elapsed="0.000927">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:20.194568" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:20.147731" elapsed="0.046935">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.194845" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.195053" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:20.195118" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:20.145190" elapsed="0.050027">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.195412" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.195599" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.195774" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.195942" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.196113" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:20.196281" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:20.196348" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:20.142292" elapsed="0.054170">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:21.229944" 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-11T01:03:21.229480" elapsed="0.000510"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:21.230475" 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-11T01:03:21.230162" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:21.230549" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T01:03:21.230716" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:21.229075" elapsed="0.001666"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:21.235463" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:21.235260" elapsed="0.000230"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:21.235645" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:21.236197" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:21.235990" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:21.236680" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:21.236425" elapsed="0.000297"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:21.236874" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:21.237427" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:21.237208" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:21.237869" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:21.237627" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:21.238519" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:21.238081" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:21.238955" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:21.238718" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:21.239449" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:21.239150" elapsed="0.000325"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:21.246265" elapsed="0.000315"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:21.255796" elapsed="0.000415"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:21.257072" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:21.256492" elapsed="0.000687"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:21.259568" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:21.259046" elapsed="0.000669">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:21.259806" elapsed="0.000049"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:21.257526" elapsed="0.002472">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.260337" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.260766" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.261236" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.261644" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.262012" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.262365" elapsed="0.000035"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.262695" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.263083" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.263409" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.264719" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.265738" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.266780" elapsed="0.000055"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:21.263719" elapsed="0.003165"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:21.263582" elapsed="0.003362"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.267145" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:21.267306" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:21.255010" elapsed="0.012423">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:21.267505" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:21.243930" elapsed="0.023676">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.267824" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.272345" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.272717" elapsed="0.000025"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:21.272788" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:21.234707" elapsed="0.038194">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:21.273030" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:21.273079" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:21.234121" elapsed="0.038981"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:21.273313" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:21.273192" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:21.273170" elapsed="0.000228"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:21.274767" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:21.275453" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:21.275132" elapsed="0.000348"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:21.276578" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:21.276003" elapsed="0.000665">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:21.276730" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:21.275663" elapsed="0.001172">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.277011" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.277186" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.277360" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.277550" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.277717" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.277881" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.278059" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.278229" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.278408" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.278821" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.279000" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.279166" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:21.278538" elapsed="0.000717"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:21.278475" elapsed="0.000808"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.279443" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:21.279506" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:21.274177" elapsed="0.005434">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:21.279722" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:21.279765" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:21.273558" elapsed="0.006230"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:21.280417" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:21.280085" elapsed="0.000395">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:21.279869" elapsed="0.000674">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:21.279850" elapsed="0.000725">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:21.280620" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:21.233544" elapsed="0.047172">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.280894" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.281064" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:21.281126" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:21.231041" elapsed="0.050182">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.281420" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.281603" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.281775" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.281949" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.282123" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:21.282287" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:21.282348" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:21.228297" elapsed="0.054165">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:22.316329" 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-11T01:03:22.315868" elapsed="0.000494"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:22.316854" 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-11T01:03:22.316553" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:22.316930" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:03:22.317100" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:22.315434" elapsed="0.001691"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:22.321936" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:22.321740" elapsed="0.000224"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:22.322121" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:22.322702" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:22.322493" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:22.323173" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:22.322918" elapsed="0.000297"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:22.323364" elapsed="0.000203"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:22.323928" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:22.323722" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:22.324367" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:22.324125" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:22.325104" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:22.324580" elapsed="0.000551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:22.325600" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:22.325305" elapsed="0.000340"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:22.326085" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:22.325800" elapsed="0.000312"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:22.334497" elapsed="0.000411"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:22.345069" elapsed="0.000461"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:22.346427" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:22.345794" elapsed="0.000761"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:22.348922" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:22.348417" elapsed="0.000656">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:22.349163" elapsed="0.000052"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:22.346910" elapsed="0.002446">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.349759" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.350150" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.350681" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.351072" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.351498" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.351852" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.352167" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.352579" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.352892" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.354152" elapsed="0.000055"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.355230" elapsed="0.000055"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.356245" elapsed="0.000055"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:22.353204" elapsed="0.003145"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:22.353069" elapsed="0.003359"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.356630" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:22.356795" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:22.344296" elapsed="0.012612">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:22.356980" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:22.330418" elapsed="0.026663">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.357262" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.361675" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.361871" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:22.361937" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:22.321095" elapsed="0.040946">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:22.362153" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:22.362196" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:22.320542" elapsed="0.041677"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:22.362600" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:22.362306" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:22.362286" elapsed="0.000381"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:22.363966" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:22.364690" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:22.364365" elapsed="0.000352"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:22.365666" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:22.365239" elapsed="0.000514">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:22.365815" elapsed="0.000160"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:22.364900" elapsed="0.001166">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.366244" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.366474" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.366655" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.366826" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.366992" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.367157" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.367322" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.367540" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.367706" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.367962" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.368135" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.368296" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:22.367833" elapsed="0.000515"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:22.367770" elapsed="0.000604"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.368619" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:22.368678" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:22.363425" elapsed="0.005358">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:22.368892" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:22.368935" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:22.362821" elapsed="0.006137"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:22.369629" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:22.369263" elapsed="0.000431">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:22.369037" elapsed="0.000719">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:22.369019" elapsed="0.000769">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:22.369832" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:22.319973" elapsed="0.049957">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.370147" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.370318" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:22.370403" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:22.317459" elapsed="0.053047">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.370680" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.370869" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.371042" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.371206" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.371376" elapsed="0.000046"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:22.371572" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:22.371634" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:22.314654" elapsed="0.057078">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.406281" 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-11T01:03:23.405807" elapsed="0.000508"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.406803" 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-11T01:03:23.406506" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:23.406879" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T01:03:23.407051" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:03:23.405376" elapsed="0.001700"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:03:23.411812" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:03:23.411624" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:23.411995" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:23.412588" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:23.412341" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.413287" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:23.412810" elapsed="0.000519"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:03:23.413499" elapsed="0.000212"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:23.414096" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:03:23.413884" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.414735" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:23.414417" elapsed="0.000365"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.415294" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:23.414944" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.415783" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:03:23.415513" elapsed="0.000331"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.416303" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:23.416012" elapsed="0.000318"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:23.422974" elapsed="0.000308"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:23.432560" elapsed="0.000428"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.433866" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:23.433254" elapsed="0.000717"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:23.436446" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.435917" elapsed="0.000682">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.436691" elapsed="0.000050"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.434338" elapsed="0.002547">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.437257" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.437688" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.438158" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.438576" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.438930" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.439296" elapsed="0.000029"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.439652" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.440046" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.440354" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.441703" elapsed="0.000055"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.442735" elapsed="0.000056"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.443759" elapsed="0.000054"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:23.440689" elapsed="0.003173"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.440549" elapsed="0.003376"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.444127" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.444290" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.431781" elapsed="0.012634">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.444486" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.420614" elapsed="0.024028">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.444829" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.449583" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.449785" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.449850" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.411069" elapsed="0.038886">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:23.450066" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:23.450108" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:23.410514" elapsed="0.039617"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.450339" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:23.450220" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:23.450198" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:03:23.451714" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.452371" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:03:23.452075" elapsed="0.000337"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:03:23.453372" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.452968" elapsed="0.000680">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.453711" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.452600" elapsed="0.001215">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.453989" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.454161" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.454339" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.454528" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.454697" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.454862" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.455028" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.455198" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.455361" elapsed="0.000067"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.455699" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.455879" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.456043" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:03:23.455543" elapsed="0.000553"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.455478" elapsed="0.000644"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.456264" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.456324" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.451162" elapsed="0.005284">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:03:23.456559" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:03:23.456602" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:23.450578" elapsed="0.006046"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.457337" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.456934" elapsed="0.000483">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:03:23.456704" elapsed="0.000778">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:03:23.456685" elapsed="0.000829">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.457559" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.409948" elapsed="0.047710">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.457838" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.458012" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.458073" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:03:23.407396" elapsed="0.050774">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.458339" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.458546" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.458716" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.458877" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.459043" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.459207" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.459266" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.404524" elapsed="0.054889">Could not parse owner and candidates for device openflow:1</status>
</kw>
<msg time="2026-04-11T01:03:23.459538" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.911520" elapsed="30.548111">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.459709" elapsed="0.000016"/>
</return>
<arg>openflow:1</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.909330" elapsed="30.550479">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<msg time="2026-04-11T01:03:23.459895" level="FAIL">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device</arg>
<arg>openflow:1</arg>
<arg>1</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.901200" elapsed="30.558781">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<doc>Check Entity Owner Status and identify owner and successor for first switch s1.</doc>
<status status="FAIL" start="2026-04-11T01:02:52.889128" elapsed="30.571027">Keyword 'ClusterOpenFlow.Get OpenFlow Entity Owner Status For One Device' failed after retrying for 10 seconds. The last error was: Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</test>
<test id="s1-s4-t59" name="Check Linear Topology After Owner Restart" line="407">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:03:23.463651" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:03:23.463370" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.464920" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:23.464798" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:23.464777" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.469808" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:23.469701" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:23.469682" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.470865" 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-11T01:03:23.470488" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.471332" 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-11T01:03:23.471051" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:23.471416" elapsed="0.000031"/>
</return>
<msg time="2026-04-11T01:03:23.471572" 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-11T01:03:23.470100" elapsed="0.001497"/>
</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-11T01:03:23.471938" 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-11T01:03:23.472176" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:23.472033" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:23.472016" elapsed="0.000234"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:03:23.471797" elapsed="0.000476"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.471647" elapsed="0.000650"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:03:23.469325" elapsed="0.003075"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:03:23.464511" elapsed="0.007947"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:23.464070" elapsed="0.008432"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:03:23.461050" elapsed="0.011503"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:23.474528" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:23.474214" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:23.474601" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:03:23.474750" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:23.473863" elapsed="0.000911"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:23.475189" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.474946" elapsed="0.000663">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.475835" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.476326" elapsed="0.000023"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.476557" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.476771" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.477025" elapsed="0.000024"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.477218" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.477427" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.477681" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:23.477517" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:23.477499" elapsed="0.000261"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.477973" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:23.477814" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:23.477798" elapsed="0.000253"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:23.480109" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:23.478102" elapsed="0.002068"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:23.478087" elapsed="0.002108"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:03:23.476141" elapsed="0.004079"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:23.475920" elapsed="0.004325"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.473480" elapsed="0.006859">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:24.484276" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:24.483536" elapsed="0.000810"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:24.484552" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:03:24.484916" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:24.482697" elapsed="0.002276"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:24.485755" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:24.485325" elapsed="0.000928">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:24.486569" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:24.487245" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:24.487536" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:24.487798" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:24.488058" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:24.488317" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:24.488612" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:24.488974" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:24.488739" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:24.488713" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:24.489382" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:24.489158" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:24.489136" elapsed="0.000390"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:24.489862" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:24.489617" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:24.489590" elapsed="0.000383"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:03:24.487026" elapsed="0.002980"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:24.486767" elapsed="0.003276"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:03:24.481640" elapsed="0.008536">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:25.494178" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:25.493427" elapsed="0.000820"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:25.494362" elapsed="0.000113"/>
</return>
<msg time="2026-04-11T01:03:25.494755" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:25.492596" elapsed="0.002217"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:25.495735" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:25.495164" elapsed="0.001409">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:25.496875" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:25.497466" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:25.497738" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:25.498005" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:25.498265" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:25.498549" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:25.498812" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:25.499169" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:25.498937" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:25.498911" elapsed="0.000368"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:25.499603" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:25.499351" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:25.499330" elapsed="0.000383"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:25.500024" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:25.499786" elapsed="0.000403"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:25.499764" elapsed="0.000459"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:03:25.497225" elapsed="0.003031"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:25.496975" elapsed="0.003316"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:03:25.491511" elapsed="0.008938">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:26.505095" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:26.504300" elapsed="0.000866"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:26.505289" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:03:26.505721" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:26.503455" elapsed="0.002325"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:26.506720" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:26.506137" elapsed="0.001466">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:26.508072" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:26.508906" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:26.509181" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:26.509469" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:26.509738" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:26.510022" elapsed="0.000034"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:26.510295" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:26.510673" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:26.510441" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:26.510413" elapsed="0.000370"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:26.511080" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:26.510855" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:26.510834" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:26.511570" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:26.511261" elapsed="0.000392"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:26.511240" elapsed="0.000447"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:03:26.508675" elapsed="0.003046"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:26.508236" elapsed="0.003521"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:03:26.501781" elapsed="0.010108">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:27.516185" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:27.515271" elapsed="0.000989"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:27.516417" elapsed="0.000089"/>
</return>
<msg time="2026-04-11T01:03:27.516794" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:27.514362" elapsed="0.002488"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:27.517840" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:27.517207" elapsed="0.001451">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:27.519146" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:27.520156" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:27.520612" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:27.521359" elapsed="0.000080"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:27.521838" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:27.522256" elapsed="0.000044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:27.522706" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:27.523333" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:27.522926" elapsed="0.000564"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:27.522882" elapsed="0.000666"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:27.524068" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:27.523672" elapsed="0.000523"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:27.523636" elapsed="0.000612"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:27.524805" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:27.524370" elapsed="0.000581"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:27.524330" elapsed="0.000682"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:03:27.519801" elapsed="0.005280"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:27.519355" elapsed="0.005784"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:03:27.513206" elapsed="0.012149">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:28.528657" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:28.527759" elapsed="0.000946"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:28.528786" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T01:03:28.529025" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:28.527201" elapsed="0.001860"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:28.529696" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:28.529290" elapsed="0.000943">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:28.530579" elapsed="0.000042"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:28.531214" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:28.531505" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:28.531823" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:28.532087" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:28.532349" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:28.532638" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:28.533026" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:28.532768" elapsed="0.000340"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:28.532739" elapsed="0.000406"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:28.533471" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:28.533223" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:28.533200" elapsed="0.000384"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:28.533883" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:28.533660" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:28.533637" elapsed="0.000355"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:03:28.530990" elapsed="0.003033"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:28.530712" elapsed="0.003425"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:03:28.526449" elapsed="0.007831">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:29.538527" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:29.537674" elapsed="0.000927"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:29.538724" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T01:03:29.539090" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:29.536787" elapsed="0.002361"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:29.540085" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:29.539532" elapsed="0.001348">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:29.541533" elapsed="0.000066"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:29.542606" elapsed="0.000061"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:29.543096" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:29.543567" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:29.544138" elapsed="0.000058"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:29.544642" elapsed="0.000051"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:29.545091" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:29.545732" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:29.545307" elapsed="0.000557"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:29.545262" elapsed="0.000662"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:29.546514" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:29.546096" elapsed="0.000540"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:29.546058" elapsed="0.000616"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:29.546970" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:29.546747" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:29.546726" elapsed="0.000351"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:03:29.542190" elapsed="0.004919"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:29.541728" elapsed="0.005417"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:03:29.535683" elapsed="0.011599">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:30.551355" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:30.550595" elapsed="0.000863"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:30.551579" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:03:30.551941" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:30.549693" elapsed="0.002314"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:30.553614" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:30.552424" elapsed="0.002060">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:30.554957" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:30.555950" elapsed="0.000059"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:30.556449" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:30.556870" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:30.557449" elapsed="0.000141"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:30.558029" elapsed="0.000050"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:30.558495" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:30.558935" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:30.558709" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:30.558660" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:30.559230" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:30.559070" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:30.559054" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:30.559534" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:30.559360" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:30.559344" elapsed="0.000267"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:03:30.555550" elapsed="0.004085"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:30.555118" elapsed="0.004544"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:03:30.548608" elapsed="0.011152">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:31.563988" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:31.563209" elapsed="0.000847"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:31.564175" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:03:31.564561" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:31.562365" elapsed="0.002255"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:31.565573" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:31.564975" elapsed="0.001350">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:31.566821" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:31.567760" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:31.568188" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:31.568636" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:31.569105" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:31.569560" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:31.569913" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:31.570170" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:31.570005" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:31.569985" elapsed="0.000266"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:31.570478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:31.570303" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:31.570288" elapsed="0.000270"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:31.570783" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:31.570620" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:31.570603" elapsed="0.000259"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:03:31.567379" elapsed="0.003506"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:31.566981" elapsed="0.003930"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:03:31.561221" elapsed="0.009787">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:32.575134" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:32.574358" elapsed="0.000848"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:32.575324" elapsed="0.000108"/>
</return>
<msg time="2026-04-11T01:03:32.575715" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:32.573548" elapsed="0.002225"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:32.576721" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:32.576126" elapsed="0.001486">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:32.578081" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:32.579535" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:32.579969" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:32.580450" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:32.580936" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:32.581352" elapsed="0.000073"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:32.581789" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:32.582048" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:32.581883" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:32.581862" elapsed="0.000266"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:32.582344" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:32.582182" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:32.582166" elapsed="0.000273"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:32.582654" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:32.582493" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:32.582477" elapsed="0.000255"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:03:32.579146" elapsed="0.003612"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:32.578240" elapsed="0.004548"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:03:32.572305" elapsed="0.010579">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:33.586816" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:33.586052" elapsed="0.000834"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:33.587004" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T01:03:33.587355" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:33.585222" elapsed="0.002220"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:33.588416" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:33.587794" elapsed="0.001240">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.589325" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.589925" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.590189" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.590465" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.590725" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.590987" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.591346" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.591727" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:33.591497" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:33.591470" elapsed="0.000370"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.592161" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:33.591915" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:33.591893" elapsed="0.000380"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.592600" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:33.592348" elapsed="0.000332"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:33.592326" elapsed="0.000387"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:03:33.589703" elapsed="0.003043"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:03:33.589449" elapsed="0.003333"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:03:33.584176" elapsed="0.008741">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T01:03:33.593039" level="FAIL">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Linear Topology On Member</arg>
<arg>${SWITCHES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.472742" elapsed="10.120424">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Linear Topology.</doc>
<status status="FAIL" start="2026-04-11T01:03:23.460544" elapsed="10.132832">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t60" name="Add Configuration In Owner and Verify After Owner Restart" line="411">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:03:33.598286" elapsed="0.000315"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:03:33.597917" elapsed="0.000761"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:03:33.600149" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:33.599949" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:33.599922" elapsed="0.000324"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:03:33.605141" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:33.605034" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:33.605016" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:33.606216" 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-11T01:03:33.605835" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:33.606706" 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-11T01:03:33.606420" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:33.606777" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:03:33.606931" 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-11T01:03:33.605453" elapsed="0.001503"/>
</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-11T01:03:33.607301" 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-11T01:03:33.607562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:33.607412" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:33.607394" elapsed="0.000246"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:03:33.607158" elapsed="0.000506"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:33.607008" elapsed="0.000682"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:03:33.604676" elapsed="0.003066"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:03:33.599549" elapsed="0.008248"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:33.598894" elapsed="0.008988"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:03:33.594675" elapsed="0.013263"/>
</kw>
<kw name="Add Single Group And Flow On Member">
<msg time="2026-04-11T01:03:33.611859" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Add 1 group 1&amp;2 and 1 flow in every switch.</doc>
<status status="FAIL" start="2026-04-11T01:03:33.608083" elapsed="0.003815">Variable '${new_owner}' not found.</status>
</kw>
<doc>Add 1 group type 1&amp;2 and 1 flow in every switch.</doc>
<status status="FAIL" start="2026-04-11T01:03:33.593854" elapsed="0.018203">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s4-t61" name="Check Stats Are Not Frozen After Owner Restart" line="415">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:03:33.615627" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:03:33.615346" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:03:33.616911" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:33.616798" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:33.616778" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:03:33.621724" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:33.621618" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:33.621599" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:33.622787" 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-11T01:03:33.622412" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:33.623256" 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-11T01:03:33.622975" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:33.623325" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:03:33.623493" 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-11T01:03:33.622022" elapsed="0.001496"/>
</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-11T01:03:33.623863" 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-11T01:03:33.624131" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:33.623959" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:33.623943" elapsed="0.000266"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:03:33.623720" elapsed="0.000512"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:33.623571" elapsed="0.000685"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:03:33.621236" elapsed="0.003071"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:03:33.616511" elapsed="0.007849"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:33.616069" elapsed="0.008352"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:03:33.612891" elapsed="0.011582"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:03:33.628532" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="FAIL" start="2026-04-11T01:03:33.624654" elapsed="0.003916">Variable '${new_owner}' not found.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>30s</arg>
<arg>1s</arg>
<arg>Check Flow Stats Are Not Frozen</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.628743" elapsed="0.000021"/>
</kw>
<doc>Check that duration flow stat is increasing.</doc>
<status status="FAIL" start="2026-04-11T01:03:33.612343" elapsed="0.016548">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s4-t62" name="Check Flows In Operational DS After Owner Restart" line="420">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:03:33.632252" elapsed="0.000248"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:03:33.631975" elapsed="0.000583"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:03:33.633567" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:33.633449" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:33.633424" 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-11T01:03:33.639858" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:03:33.639748" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T01:03:33.639729" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:03:33.640978" 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-11T01:03:33.640580" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:03:33.641486" 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-11T01:03:33.641178" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:03:33.641558" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T01:03:33.641723" 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-11T01:03:33.640177" elapsed="0.001571"/>
</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-11T01:03:33.642096" 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-11T01:03:33.642340" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:03:33.642194" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:03:33.642177" elapsed="0.000258"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:03:33.641950" elapsed="0.000508"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:03:33.641800" elapsed="0.000682"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:03:33.639311" elapsed="0.003225"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:03:33.633137" elapsed="0.009455"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:03:33.632714" elapsed="0.009931"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:03:33.629710" elapsed="0.012989"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:33.644485" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:33.644169" elapsed="0.000343"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:33.644559" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:03:33.644713" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:33.643805" elapsed="0.000934"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:33.645144" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:33.644901" elapsed="0.000625">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.645737" elapsed="0.000024"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.645931" elapsed="0.000022"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:33.646129" elapsed="0.000021"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:33.643415" elapsed="0.002828">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:34.650481" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:34.649665" elapsed="0.000887"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:34.650672" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:03:34.651026" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:34.648280" elapsed="0.002802"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:34.652166" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:34.651571" elapsed="0.001539">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:34.653724" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:34.654156" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:34.654707" elapsed="0.000055"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:34.647160" elapsed="0.007820">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:35.658568" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:35.657793" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:35.658755" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:03:35.659162" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:35.656964" elapsed="0.002259"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:35.660186" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:35.659629" elapsed="0.001352">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:35.661476" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:35.661902" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:35.662337" elapsed="0.000044"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:35.655889" elapsed="0.006730">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:36.666453" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:36.665656" elapsed="0.000869"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:36.666708" elapsed="0.000088"/>
</return>
<msg time="2026-04-11T01:03:36.667084" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:36.664812" elapsed="0.002329"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:36.668120" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:36.667538" elapsed="0.001367">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:36.669367" elapsed="0.000082"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:36.669829" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:36.670288" elapsed="0.000065"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:36.663654" elapsed="0.007022">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:37.674370" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:37.673561" elapsed="0.000911"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:37.674591" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:03:37.674942" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:37.672739" elapsed="0.002257"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:37.676478" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:37.675340" elapsed="0.001899">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:37.677734" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:37.678179" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:37.678642" elapsed="0.000046"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:37.671695" elapsed="0.007198">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:38.682691" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:38.681920" elapsed="0.000839"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:38.682875" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:03:38.683229" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:38.681063" elapsed="0.002223"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:38.684208" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:38.683666" elapsed="0.001318">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:38.685476" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:38.685918" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:38.686355" elapsed="0.000073"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:38.680007" elapsed="0.006628">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:39.690559" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:39.689721" elapsed="0.000908"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:39.690749" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:03:39.691106" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:39.688803" elapsed="0.002358"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:39.692088" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:39.691540" elapsed="0.001339">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:39.693364" elapsed="0.000078"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:39.693819" elapsed="0.000044"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:39.694270" elapsed="0.000050"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:39.687640" elapsed="0.006920">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:40.699336" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:40.697571" elapsed="0.001865"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:40.699559" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:03:40.699918" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:40.696657" elapsed="0.003315"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:40.700969" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:40.700324" elapsed="0.001434">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:40.702216" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:40.702670" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:40.703113" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:40.695552" elapsed="0.007810">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:41.708432" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:41.707535" elapsed="0.000995"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:41.708653" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T01:03:41.709016" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:41.706260" elapsed="0.002811"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:41.710159" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:41.709604" elapsed="0.001359">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:41.711453" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:41.711875" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:41.712361" elapsed="0.000083"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:41.705161" elapsed="0.007495">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:42.716336" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:42.715545" elapsed="0.000891"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:42.716560" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T01:03:42.716925" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:42.714695" elapsed="0.002287"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:42.717920" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:42.717334" elapsed="0.001394">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:42.719199" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:42.719676" elapsed="0.000050"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:42.720125" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:42.713604" elapsed="0.006867">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:43.724493" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:43.723626" elapsed="0.000949"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:43.724701" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T01:03:43.725081" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:43.722653" elapsed="0.002488"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:43.726216" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:43.725579" elapsed="0.001508">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:43.727677" elapsed="0.000058"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:43.728151" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:43.728681" elapsed="0.000054"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:43.721492" elapsed="0.007469">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:44.733801" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:44.732813" elapsed="0.001062"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:44.733998" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:03:44.734360" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:44.731107" elapsed="0.003341"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:44.735498" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:44.734836" elapsed="0.001792">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:44.737105" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:44.737564" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:44.738175" elapsed="0.000061"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:44.729974" elapsed="0.008567">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:45.742342" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:45.741532" elapsed="0.000913"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:45.742567" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:03:45.742925" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:45.740691" elapsed="0.002291"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:45.743922" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:45.743336" elapsed="0.001381">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:45.745182" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:45.745640" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:45.746075" elapsed="0.000044"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:45.739599" elapsed="0.006748">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:46.750064" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:46.749267" elapsed="0.000867"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:46.750253" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:03:46.750635" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:46.748469" elapsed="0.002222"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:46.751606" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:46.751039" elapsed="0.001303">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:46.752832" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:46.753258" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:46.753723" elapsed="0.000075"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:46.747355" elapsed="0.006658">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:47.757977" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:47.756950" elapsed="0.001098"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:47.758164" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:03:47.758554" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:47.756116" elapsed="0.002494"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:47.762494" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:47.758964" elapsed="0.004307">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:47.763766" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:47.764193" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:47.764655" elapsed="0.000046"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:47.755031" elapsed="0.009874">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:48.768594" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:48.767817" elapsed="0.001032"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:48.768982" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:03:48.769344" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:48.766981" elapsed="0.002450"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:48.770413" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:48.769830" elapsed="0.001352">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:48.771687" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:48.772123" elapsed="0.000058"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:48.772622" elapsed="0.000055"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:48.765901" elapsed="0.007080">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:49.776811" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:49.776022" elapsed="0.000855"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:49.776989" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T01:03:49.777333" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:49.775193" elapsed="0.002222"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:49.778301" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:49.777768" elapsed="0.001299">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:49.779642" elapsed="0.000054"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:49.780080" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:49.780558" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:49.774051" elapsed="0.006759">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:50.784544" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:50.783720" elapsed="0.000894"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:50.784776" elapsed="0.000116"/>
</return>
<msg time="2026-04-11T01:03:50.785199" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:50.782892" elapsed="0.002362"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:50.786193" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:50.785644" elapsed="0.001381">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:50.787529" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:50.788020" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:50.788405" elapsed="0.000021"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:50.781800" elapsed="0.006722">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:51.792996" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:51.792144" elapsed="0.000923"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:51.793189" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:03:51.793599" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:51.791218" elapsed="0.002440"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:51.794645" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:51.794032" elapsed="0.001545">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:51.796215" elapsed="0.000058"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:51.796571" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:51.796892" elapsed="0.000035"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:51.789505" elapsed="0.007560">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:52.800948" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:52.800075" elapsed="0.000946"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:52.801144" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:03:52.801564" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:52.799150" elapsed="0.002488"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:52.802820" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:52.802115" elapsed="0.001633">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:52.804228" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:52.804701" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:52.805148" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:52.798016" elapsed="0.007455">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:53.809297" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:53.808469" elapsed="0.000907"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:53.809546" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:03:53.809932" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:53.807633" elapsed="0.002357"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:53.810967" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:53.810375" elapsed="0.001401">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:53.812264" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:53.812754" elapsed="0.000050"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:53.813196" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:53.806556" elapsed="0.007003">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:54.817262" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:54.816513" elapsed="0.000818"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:54.817480" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:03:54.817840" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:54.815668" elapsed="0.002249"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:54.819423" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:54.818272" elapsed="0.001910">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:54.820710" elapsed="0.000054"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:54.821145" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:54.821609" elapsed="0.000046"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:54.814584" elapsed="0.007470">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:55.826881" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:55.824960" elapsed="0.002057"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:55.827223" elapsed="0.000125"/>
</return>
<msg time="2026-04-11T01:03:55.827706" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:55.824128" elapsed="0.003636"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:55.828802" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:55.828178" elapsed="0.001506">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:55.830167" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:55.830627" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:55.831069" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:55.823046" elapsed="0.008275">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:56.834041" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:56.833477" elapsed="0.000614"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:56.834177" elapsed="0.000060"/>
</return>
<msg time="2026-04-11T01:03:56.834441" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:56.832874" elapsed="0.001606"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:56.835095" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:56.834713" elapsed="0.000940">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:56.835968" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:56.836249" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:56.836557" elapsed="0.000031"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:56.832096" elapsed="0.004631">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:57.840376" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:57.839627" elapsed="0.000905"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:57.840657" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:03:57.841019" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:57.838772" elapsed="0.002304"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:57.841851" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:57.841458" elapsed="0.000893">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:57.842671" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:57.842939" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:57.843212" elapsed="0.000039"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:57.837695" elapsed="0.005711">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:58.847734" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:58.846959" elapsed="0.000845"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:58.847922" elapsed="0.000129"/>
</return>
<msg time="2026-04-11T01:03:58.848540" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:58.846113" elapsed="0.002486"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:58.849456" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:58.848955" elapsed="0.000999">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:58.850247" elapsed="0.000030"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:58.850532" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:58.850806" elapsed="0.000030"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:58.844365" elapsed="0.006600">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:03:59.853974" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:03:59.853142" elapsed="0.000904"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:03:59.854169" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:03:59.854579" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:03:59.852370" elapsed="0.002271"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:03:59.855674" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:03:59.855021" elapsed="0.001484">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:59.857011" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:59.857495" elapsed="0.000050"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:03:59.857943" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:03:59.851680" elapsed="0.006514">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:00.862364" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:00.861429" elapsed="0.001043"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:00.862602" elapsed="0.000112"/>
</return>
<msg time="2026-04-11T01:04:00.863105" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:00.860472" elapsed="0.002695"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:00.864139" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:00.863565" elapsed="0.001522">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:00.865656" elapsed="0.000073"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:00.866159" elapsed="0.000052"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:00.866715" elapsed="0.000055"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:00.859293" elapsed="0.007807">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:01.871097" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:01.870223" elapsed="0.000947"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:01.871334" elapsed="0.000128"/>
</return>
<msg time="2026-04-11T01:04:01.871776" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:01.869323" elapsed="0.002513"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:01.873523" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:01.872218" elapsed="0.002133">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:01.874918" elapsed="0.000055"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:01.875630" elapsed="0.000080"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:01.876266" elapsed="0.000059"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:01.868170" elapsed="0.008475">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:02.880457" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:02.879653" elapsed="0.000876"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:02.880650" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:04:02.881015" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:02.878759" elapsed="0.002312"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:02.882062" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:02.881457" elapsed="0.001424">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:02.883348" elapsed="0.000080"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:02.883806" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:02.884268" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:02.877683" elapsed="0.006875">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:03.888210" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:03.887469" elapsed="0.000809"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:03.888424" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:04:03.888785" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:03.886640" elapsed="0.002201"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:03.889881" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:03.889223" elapsed="0.001451">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:03.890990" elapsed="0.000033"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:03.891267" elapsed="0.000032"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:03.891570" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:03.885577" elapsed="0.006159">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T01:04:03.891855" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Flows On Member</arg>
<arg>${all_flows}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:03:33.642863" elapsed="30.249121">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Flows in Operational DS.</doc>
<status status="FAIL" start="2026-04-11T01:03:33.629185" elapsed="30.263015">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t63" name="Check Groups In Operational DS After Owner Restart" line="424">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:04:03.897382" elapsed="0.000368"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:04:03.897007" elapsed="0.000823"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:04:03.899326" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:04:03.899157" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:03.899126" elapsed="0.000326"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:04:03.904911" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:04:03.904801" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:03.904782" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:04:03.906122" 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-11T01:04:03.905716" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:04:03.906632" 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-11T01:04:03.906318" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:04:03.906709" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T01:04:03.906868" 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-11T01:04:03.905283" elapsed="0.001611"/>
</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-11T01:04:03.907270" 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-11T01:04:03.907538" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:03.907369" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:03.907352" elapsed="0.000264"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:04:03.907121" elapsed="0.000519"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:04:03.906952" elapsed="0.000715"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:04:03.904430" elapsed="0.003292"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:04:03.898731" elapsed="0.009052"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:04:03.898055" elapsed="0.009775"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:04:03.893624" elapsed="0.014259"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:03.909759" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:03.909379" elapsed="0.000407"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:03.909834" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:04:03.909981" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:03.909025" elapsed="0.000981"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:03.910424" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:03.910164" elapsed="0.000573">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:03.910937" elapsed="0.000023"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:03.911125" elapsed="0.000020"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:03.911317" elapsed="0.000020"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:03.908608" elapsed="0.002837">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:04.915677" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:04.914301" elapsed="0.001444"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:04.915864" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:04:04.916219" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:04.913483" elapsed="0.002792"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:04.917231" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:04.916662" elapsed="0.001355">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:04.918503" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:04.918927" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:04.919510" elapsed="0.000050"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:04.912324" elapsed="0.007443">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:05.923500" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:05.922716" elapsed="0.000855"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:05.923688" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:04:05.924047" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:05.921879" elapsed="0.002224"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:05.924989" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:05.924488" elapsed="0.001034">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:05.925829" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:05.926100" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:05.926373" elapsed="0.000048"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:05.920804" elapsed="0.005751">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:06.930238" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:06.929481" elapsed="0.000827"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:06.930456" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:04:06.930821" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:06.928639" elapsed="0.002239"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:06.931851" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:06.931232" elapsed="0.001451">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:06.933028" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:06.933297" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:06.933595" elapsed="0.000030"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:06.927532" elapsed="0.006223">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:07.937585" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:07.936761" elapsed="0.000896"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:07.937779" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:04:07.938156" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:07.935876" elapsed="0.002338"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:07.939835" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:07.938624" elapsed="0.001731">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:07.940675" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:07.940940" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:07.941210" elapsed="0.000027"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:07.934743" elapsed="0.006625">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:08.944910" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:08.944150" elapsed="0.000970"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:08.945257" elapsed="0.000092"/>
</return>
<msg time="2026-04-11T01:04:08.945737" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:08.943322" elapsed="0.002476"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:08.946752" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:08.946163" elapsed="0.001408">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:08.948042" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:08.948496" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:08.948937" elapsed="0.000046"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:08.942257" elapsed="0.006936">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:09.953098" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:09.952275" elapsed="0.000898"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:09.953295" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T01:04:09.953711" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:09.951366" elapsed="0.002405"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:09.954833" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:09.954154" elapsed="0.001515">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:09.956161" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:09.956652" elapsed="0.000050"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:09.957126" elapsed="0.000049"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:09.950152" elapsed="0.007271">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:10.961132" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:10.960357" elapsed="0.000845"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:10.961317" elapsed="0.000108"/>
</return>
<msg time="2026-04-11T01:04:10.961705" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:10.959562" elapsed="0.002199"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:10.962765" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:10.962110" elapsed="0.001233">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:10.963661" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:10.963926" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:10.964196" elapsed="0.000027"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:10.958495" elapsed="0.005857">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:11.968566" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:11.967800" elapsed="0.000836"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:11.968750" elapsed="0.000088"/>
</return>
<msg time="2026-04-11T01:04:11.969117" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:11.966967" elapsed="0.002205"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:11.970113" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:11.969548" elapsed="0.001467">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:11.971508" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:11.971940" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:11.972380" elapsed="0.000076"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:11.965249" elapsed="0.007418">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:12.976346" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:12.975595" elapsed="0.000849"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:12.976564" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:04:12.976920" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:12.974752" elapsed="0.002224"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:12.977966" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:12.977406" elapsed="0.001095">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:12.978813" elapsed="0.000033"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:12.979083" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:12.979360" elapsed="0.000049"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:12.973672" elapsed="0.005874">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:13.983154" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:13.982381" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:13.983341" elapsed="0.000110"/>
</return>
<msg time="2026-04-11T01:04:13.983731" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:13.981581" elapsed="0.002207"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:13.984739" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:13.984143" elapsed="0.001388">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:13.985985" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:13.986447" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:13.986890" elapsed="0.000045"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:04:13.980505" elapsed="0.006636">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T01:04:13.987332" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Groups On Member</arg>
<arg>${all_groups}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:04:03.908050" elapsed="10.079513">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Groups in Operational DS.</doc>
<status status="FAIL" start="2026-04-11T01:04:03.892812" elapsed="10.095079">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t64" name="Check Flows In Switch After Owner Restart" line="432">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:04:13.993238" elapsed="0.000367"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:04:13.992863" elapsed="0.000822"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:04:13.995137" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:04:13.994966" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:13.994936" elapsed="0.000298"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.001792" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:04:14.001686" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:14.001667" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.002865" 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-11T01:04:14.002484" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.003379" 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-11T01:04:14.003087" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:04:14.003497" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T01:04:14.003653" 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-11T01:04:14.002090" elapsed="0.001587"/>
</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-11T01:04:14.004048" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.004310" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:14.004161" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:14.004144" elapsed="0.000256"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:04:14.003900" elapsed="0.000524"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.003737" elapsed="0.000716"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:04:14.001312" elapsed="0.003195"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:04:13.994554" elapsed="0.010007"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:04:13.993907" elapsed="0.010698"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:04:13.989512" elapsed="0.015143"/>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<msg time="2026-04-11T01:04:14.008925" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<arg>${all_flows}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-11T01:04:14.004935" elapsed="0.004030">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Check Flows in switch.</doc>
<status status="FAIL" start="2026-04-11T01:04:13.988608" elapsed="0.020497">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s4-t65" name="Restart Cluster" line="436">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:04:14.012372" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:04:14.012112" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.013641" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:04:14.013533" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:14.013514" 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-11T01:04:14.018457" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:04:14.018337" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:14.018319" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.019513" 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-11T01:04:14.019123" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.019983" 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-11T01:04:14.019702" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:04:14.020072" elapsed="0.000036"/>
</return>
<msg time="2026-04-11T01:04:14.020261" 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-11T01:04:14.018744" elapsed="0.001544"/>
</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-11T01:04:14.020720" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.021038" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:14.020885" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:14.020865" elapsed="0.000253"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:04:14.020536" elapsed="0.000606"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.020341" elapsed="0.000827"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:04:14.017985" elapsed="0.003237"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:04:14.013237" elapsed="0.008039"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:04:14.012822" elapsed="0.008499"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:04:14.009839" elapsed="0.011534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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-11T01:04:14.026808" 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-11T01:04:14.026431" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.027280" 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-11T01:04:14.026997" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:04:14.027351" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T01:04:14.027521" 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-11T01:04:14.026039" elapsed="0.001507"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.028507" 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-11T01:04:14.028124" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.028993" 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-11T01:04:14.028708" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:04:14.029064" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T01:04:14.029220" 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-11T01:04:14.027751" elapsed="0.001493"/>
</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-11T01:04:14.030884" 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-11T01:04:14.030495" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.031355" 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-11T01:04:14.031073" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:04:14.031484" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:04:14.031639" 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-11T01:04:14.030111" elapsed="0.001552"/>
</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-11T01:04:14.031993" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:04:14.031821" elapsed="0.000232"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.031713" elapsed="0.000365"/>
</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-11T01:04:14.029462" elapsed="0.002668"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.032586" 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-11T01:04:14.032283" elapsed="0.000329"/>
</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-11T01:04:14.032783" elapsed="0.000206"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.033162" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:04:14.033059" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:14.033041" elapsed="0.000219"/>
</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-11T01:04:14.033573" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:04:14.033429" elapsed="0.000207"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.033301" elapsed="0.000361"/>
</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-11T01:04:14.036786" 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-11T01:04:14.036359" elapsed="0.000454"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.037258" 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-11T01:04:14.036974" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:04:14.037329" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T01:04:14.037496" 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-11T01:04:14.035989" elapsed="0.001531"/>
</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-11T01:04:14.037844" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:04:14.037677" elapsed="0.000226"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.037571" elapsed="0.000357"/>
</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-11T01:04:14.033854" elapsed="0.004126"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-11T01:04:14.038020" elapsed="0.000026"/>
</return>
<doc>If the list is empty, stops all ODL instances. Otherwise stop members based on ${stop_index_list}
If ${confirm} is True, verify stopped instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-11T01:04:14.022064" elapsed="0.016091"/>
</kw>
<msg time="2026-04-11T01:04:14.038255" level="INFO">${status} = PASS</msg>
<msg time="2026-04-11T01:04:14.038299" level="INFO">${result} = []</msg>
<var>${status}</var>
<var>${result}</var>
<arg>ClusterManagement.Stop_Members_From_List_Or_All</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:04:14.021558" elapsed="0.016763"/>
</kw>
<if>
<branch type="IF" condition="'${status}' != 'PASS'">
<kw name="Kill_Members_From_List_Or_All" owner="ClusterManagement">
<doc>If the list is empty, kill all ODL instances. Otherwise, kill members based on ${kill_index_list}
If ${confirm} is True, sleep 1 second and verify killed 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="NOT RUN" start="2026-04-11T01:04:14.038791" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:14.038404" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:14.038373" elapsed="0.000497"/>
</if>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.050940" level="INFO">${base_command} = /tmp/karaf-0.23.1/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-11T01:04:14.050569" elapsed="0.000400"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.051600" level="INFO">${command} = /tmp/karaf-0.23.1/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-11T01:04:14.051169" elapsed="0.000462"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-11T01:04:14.052137" level="INFO">${epoch} = 1775869454.052059</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-11T01:04:14.051828" elapsed="0.000336"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.052766" level="INFO">${gc_filepath} = /tmp/karaf-0.23.1/data/log/gc_1775869454.052059.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-11T01:04:14.052336" elapsed="0.000457"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.053339" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775869454.052059.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-11T01:04:14.052961" elapsed="0.000405"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.054836" 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-11T01:04:14.054470" elapsed="0.000392"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.055299" 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-11T01:04:14.055019" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:04:14.055368" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T01:04:14.055570" 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-11T01:04:14.054091" 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-11T01:04:14.055966" elapsed="0.001357"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:04:14.055794" elapsed="0.001571"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.055683" elapsed="0.001723"/>
</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-11T01:04:14.053588" elapsed="0.003876"/>
</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">
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.067285" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:14.066980" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:14.066961" elapsed="0.000411"/>
</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-11T01:04:14.068860" 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-11T01:04:14.068467" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.069335" 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-11T01:04:14.069049" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:04:14.069422" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T01:04:14.069579" 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-11T01:04:14.068070" elapsed="0.001534"/>
</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-11T01:04:14.069937" 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-11T01:04:14.073835" elapsed="0.000027"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:04:14.069771" elapsed="0.004133"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.069656" elapsed="0.004275"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-11T01:04:14.067698" elapsed="0.006288"/>
</kw>
<status status="PASS" start="2026-04-11T01:04:14.067444" elapsed="0.006570"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:14.067427" elapsed="0.006612"/>
</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-11T01:04:14.074444" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:14.074096" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:14.074078" elapsed="0.000451"/>
</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-11T01:04:14.066564" elapsed="0.008012"/>
</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-11T01:04:14.057632" elapsed="0.017001"/>
</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-11T01:04:14.077902" 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-11T01:04:14.077524" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.078417" 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-11T01:04:14.078092" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:04:14.078490" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:04:14.078642" 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-11T01:04:14.077100" elapsed="0.001567"/>
</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-11T01:04:14.078994" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:04:14.078823" elapsed="0.000230"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.078717" elapsed="0.000366"/>
</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-11T01:04:14.074897" elapsed="0.004238"/>
</kw>
<arg>wait_for_sync=False</arg>
<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-11T01:04:14.043023" elapsed="0.036199"/>
</kw>
<doc>Stop and Start cluster.</doc>
<status status="PASS" start="2026-04-11T01:04:14.009398" elapsed="0.069926"/>
</test>
<test id="s1-s4-t66" name="Check Linear Topology After Controller Restarts" line="445">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:04:14.082614" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:04:14.082329" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.083850" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:04:14.083742" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:14.083723" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.088724" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:04:14.088598" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T01:04:14.088580" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.089780" 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-11T01:04:14.089407" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.090249" 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-11T01:04:14.089967" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:04:14.090318" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:04:14.090485" 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-11T01:04:14.089014" elapsed="0.001496"/>
</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-11T01:04:14.090847" 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-11T01:04:14.091088" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:14.090943" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:14.090926" elapsed="0.000236"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:04:14.090705" elapsed="0.000480"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.090560" elapsed="0.000650"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:04:14.088222" elapsed="0.003039"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:04:14.083458" elapsed="0.007856"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:04:14.083024" elapsed="0.008335"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:04:14.079996" elapsed="0.011431"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:14.093289" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:14.092994" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:14.093360" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T01:04:14.093543" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:14.092649" elapsed="0.000921"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:14.093967" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:14.093726" elapsed="0.000589">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.094532" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.094922" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.095109" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.095337" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.095538" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.095723" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.095909" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.096160" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:14.095994" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:14.095977" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.096465" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:14.096289" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:14.096274" elapsed="0.000269"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:14.096784" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:14.096594" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:14.096579" elapsed="0.000284"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:14.094768" elapsed="0.002118"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:14.094600" elapsed="0.002310"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:14.092244" elapsed="0.004760">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:16.101861" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:16.101045" elapsed="0.000891"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:16.102078" elapsed="0.000088"/>
</return>
<msg time="2026-04-11T01:04:16.102489" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:16.100175" elapsed="0.002374"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:16.103645" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:16.102909" elapsed="0.001690">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:16.105111" elapsed="0.000064"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:16.106110" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:16.106567" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:16.106989" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:16.107434" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:16.107873" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:16.108294" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:16.108894" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:16.108528" elapsed="0.000485"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:16.108484" elapsed="0.000583"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:16.109568" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:16.109183" elapsed="0.000532"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:16.109150" elapsed="0.000619"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:16.110239" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:16.109886" elapsed="0.000472"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:16.109852" elapsed="0.000595"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:16.105758" elapsed="0.004744"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:16.105304" elapsed="0.005255"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:16.099042" elapsed="0.011881">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:18.115143" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:18.114279" elapsed="0.000921"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:18.115282" elapsed="0.000111"/>
</return>
<msg time="2026-04-11T01:04:18.115585" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:18.113448" elapsed="0.002172"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:18.116194" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:18.115844" elapsed="0.000883">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:18.117028" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:18.117619" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:18.117879" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:18.118133" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:18.118403" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:18.118659" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:18.118951" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:18.119306" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:18.119080" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:18.119052" elapsed="0.000384"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:18.119734" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:18.119512" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:18.119490" elapsed="0.000350"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:18.120128" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:18.119910" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:18.119889" elapsed="0.000344"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:18.117401" elapsed="0.002863"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:18.117131" elapsed="0.003170"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:18.112321" elapsed="0.008137">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:20.125563" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:20.124729" elapsed="0.000932"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:20.125844" elapsed="0.000125"/>
</return>
<msg time="2026-04-11T01:04:20.126300" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:20.123076" elapsed="0.003283"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:20.127462" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:20.126809" elapsed="0.001445">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:20.128755" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:20.129698" elapsed="0.000091"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:20.130229" elapsed="0.000036"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:20.130450" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:20.130747" elapsed="0.000024"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:20.130942" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:20.131130" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:20.131406" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:20.131223" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:20.131203" elapsed="0.000285"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:20.131700" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:20.131542" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:20.131527" elapsed="0.000249"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:20.131985" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:20.131827" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:20.131812" elapsed="0.000249"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:20.129321" elapsed="0.002763"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:20.128921" elapsed="0.003191"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:20.121827" elapsed="0.010381">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:22.137013" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:22.136196" elapsed="0.000888"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:22.137223" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:04:22.137618" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:22.135346" elapsed="0.002331"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:22.138631" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:22.138034" elapsed="0.001379">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:22.139879" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:22.140860" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:22.141282" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:22.141483" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:22.141669" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:22.141857" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:22.142044" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:22.142308" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:22.142137" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:22.142116" elapsed="0.000288"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:22.142621" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:22.142459" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:22.142443" elapsed="0.000257"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:22.142913" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:22.142752" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:22.142736" elapsed="0.000255"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:22.140460" elapsed="0.002553"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:22.140038" elapsed="0.003001"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:22.134241" elapsed="0.008894">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:24.148029" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:24.146607" elapsed="0.001495"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:24.148224" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:04:24.148516" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:24.145755" elapsed="0.002797"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:24.149126" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:24.148780" elapsed="0.000880">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:24.149960" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:24.150564" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:24.150838" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:24.151105" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:24.151368" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:24.151657" elapsed="0.000039"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:24.151965" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:24.152320" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:24.152094" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:24.152068" elapsed="0.000383"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:24.152747" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:24.152524" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:24.152503" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:24.153152" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:24.152930" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:24.152909" elapsed="0.000350"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:24.150321" elapsed="0.002970"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:24.150063" elapsed="0.003263"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:24.144509" elapsed="0.008969">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:26.157660" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:26.156859" elapsed="0.000875"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:26.157854" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:04:26.158211" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:26.155993" elapsed="0.002276"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:26.159287" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:26.158678" elapsed="0.001190">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:26.160169" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:26.160787" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:26.161057" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:26.161319" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:26.161649" elapsed="0.000037"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:26.161924" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:26.162284" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:26.162756" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:26.162445" elapsed="0.000422"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:26.162408" elapsed="0.000498"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:26.163218" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:26.162987" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:26.162963" elapsed="0.000370"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:26.163697" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:26.163436" elapsed="0.000348"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:26.163409" elapsed="0.000410"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:26.160563" elapsed="0.003289"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:26.160274" elapsed="0.003615"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:26.154831" elapsed="0.009193">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:28.168592" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:28.167655" elapsed="0.001034"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:28.168855" elapsed="0.000113"/>
</return>
<msg time="2026-04-11T01:04:28.169327" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:28.166786" elapsed="0.002660"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:28.171323" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:28.170178" elapsed="0.001747">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:28.172239" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:28.172943" elapsed="0.000039"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:28.173222" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:28.173502" elapsed="0.000041"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:28.173847" elapsed="0.000055"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:28.174146" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:28.174426" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:28.174835" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:28.174597" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:28.174567" elapsed="0.000380"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:28.175248" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:28.175023" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:28.175001" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:28.175697" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:28.175455" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:28.175432" elapsed="0.000376"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:28.172683" elapsed="0.003157"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:28.172365" elapsed="0.003513"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:28.165573" elapsed="0.010445">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:30.179927" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:30.179161" elapsed="0.000836"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:30.180249" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:04:30.180651" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:30.178332" elapsed="0.002377"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:30.181675" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:30.181110" elapsed="0.001055">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:30.182489" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:30.183062" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:30.183324" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:30.183603" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:30.183859" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:30.184115" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:30.184370" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:30.184740" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:30.184515" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:30.184489" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:30.185180" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:30.184953" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:30.184928" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:30.185600" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:30.185359" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:30.185338" elapsed="0.000370"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:30.182845" elapsed="0.002894"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:30.182594" elapsed="0.003180"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:30.177305" elapsed="0.008598">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:32.190358" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:32.189557" elapsed="0.000902"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:32.190581" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:04:32.190941" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:32.188731" elapsed="0.002265"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:32.191929" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:32.191343" elapsed="0.001442">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:32.193249" elapsed="0.000048"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:32.194727" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:32.195153" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:32.195597" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:32.196059" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:32.196504" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:32.196793" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:32.197269" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:32.197016" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:32.196987" elapsed="0.000394"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:32.197716" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:32.197482" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:32.197459" elapsed="0.000366"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:32.198123" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:32.197900" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:32.197877" elapsed="0.000354"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:32.194341" elapsed="0.003923"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:32.193450" elapsed="0.004849"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:32.187553" elapsed="0.010900">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:34.202702" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:34.201839" elapsed="0.000933"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:34.202894" elapsed="0.000132"/>
</return>
<msg time="2026-04-11T01:04:34.203423" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:34.200993" elapsed="0.002496"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:34.204129" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:34.203778" elapsed="0.000869">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:34.204942" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:34.205530" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:34.205796" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:34.206053" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:34.206310" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:34.206587" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:34.206846" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:34.207211" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:34.206982" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:34.206944" elapsed="0.000377"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:34.207636" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:34.207412" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:34.207372" elapsed="0.000371"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:34.208038" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:34.207817" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:34.207795" elapsed="0.000352"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:34.205293" elapsed="0.002887"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:34.205043" elapsed="0.003172"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:34.199847" elapsed="0.008499">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:36.212337" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:36.211581" elapsed="0.000857"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:36.212562" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T01:04:36.212924" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:36.210754" elapsed="0.002225"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:36.214080" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:36.213505" elapsed="0.001366">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:36.215335" elapsed="0.000078"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:36.216728" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:36.217161" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:36.217611" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:36.218053" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:36.218507" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:36.218930" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:36.219524" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:36.219127" elapsed="0.000520"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:36.219087" elapsed="0.000614"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:36.220174" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:36.219817" elapsed="0.000476"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:36.219783" elapsed="0.000561"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:36.220847" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:36.220490" elapsed="0.000478"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:36.220455" elapsed="0.000564"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:36.216339" elapsed="0.004729"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:36.215526" elapsed="0.005598"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:36.209666" elapsed="0.011669">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:38.225377" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:38.224604" elapsed="0.000874"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:38.225598" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T01:04:38.225950" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:38.223773" elapsed="0.002234"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:38.226929" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:38.226359" elapsed="0.001356">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:38.228172" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:38.229147" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:38.229607" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:38.229923" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:38.230177" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:38.230450" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:38.230708" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:38.231061" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:38.230834" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:38.230807" elapsed="0.000453"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:38.231584" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:38.231341" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:38.231319" elapsed="0.000374"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:38.231985" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:38.231766" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:38.231745" elapsed="0.000347"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:38.228753" elapsed="0.003371"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:38.228330" elapsed="0.003828"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:38.222701" elapsed="0.009589">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:40.236433" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:40.235487" elapsed="0.001025"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:40.236631" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:04:40.236930" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:40.234650" elapsed="0.002315"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:40.237557" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:40.237190" elapsed="0.000864">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:40.238347" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:40.238942" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:40.239206" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:40.239743" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:40.240015" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:40.240303" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:40.240582" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:40.240944" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:40.240710" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:40.240684" elapsed="0.000370"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:40.241351" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:40.241128" elapsed="0.000319"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:40.241106" elapsed="0.000374"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:40.241775" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:40.241553" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:40.241531" elapsed="0.000354"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:40.238717" elapsed="0.003200"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:40.238470" elapsed="0.003483"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:40.233576" elapsed="0.008506">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:42.246216" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:42.245467" elapsed="0.000818"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:42.246434" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:04:42.246832" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:42.244535" elapsed="0.002370"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:42.247879" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:42.247292" elapsed="0.001395">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:42.249273" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:42.250224" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:42.250679" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:42.251096" elapsed="0.000097"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:42.251600" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:42.251966" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:42.252224" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:42.252595" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:42.252348" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:42.252322" elapsed="0.000384"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:42.253002" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:42.252779" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:42.252757" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:42.253424" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:42.253184" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:42.253162" elapsed="0.000372"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:42.249878" elapsed="0.003688"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:42.249473" elapsed="0.004128"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:42.243449" elapsed="0.010285">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:44.257761" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:44.256870" elapsed="0.000962"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:44.257950" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:04:44.258363" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:44.256030" elapsed="0.002419"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:44.259343" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:44.258805" elapsed="0.001166">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:44.260262" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:44.260855" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:44.261186" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:44.261476" elapsed="0.000295"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:44.262013" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:44.262282" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:44.262559" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:44.262913" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:44.262684" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:44.262658" elapsed="0.000369"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:44.263320" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:44.263098" elapsed="0.000398"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:44.263077" elapsed="0.000457"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:44.263839" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:44.263610" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:44.263588" elapsed="0.000358"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:44.260637" elapsed="0.003341"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:44.260364" elapsed="0.003650"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:44.254997" elapsed="0.009151">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:46.268184" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:46.267309" elapsed="0.000946"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:46.268405" elapsed="0.000088"/>
</return>
<msg time="2026-04-11T01:04:46.268774" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:46.266506" elapsed="0.002323"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:46.269817" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:46.269232" elapsed="0.001193">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:46.270726" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:46.271301" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:46.271594" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:46.271854" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:46.272112" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:46.272370" elapsed="0.000048"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:46.272689" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:46.273053" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:46.272824" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:46.272798" elapsed="0.000365"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:46.273494" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:46.273251" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:46.273229" elapsed="0.000374"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:46.273899" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:46.273676" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:46.273654" elapsed="0.000352"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:46.271081" elapsed="0.002956"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:46.270827" elapsed="0.003247"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:46.265460" elapsed="0.008747">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:48.278763" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:48.277941" elapsed="0.000892"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:48.278952" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:04:48.279304" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:48.277060" elapsed="0.002299"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:48.280367" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:48.279740" elapsed="0.001560">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:48.281737" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:48.282472" elapsed="0.000034"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:48.282758" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:48.283030" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:48.283609" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:48.283891" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:48.284177" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:48.284604" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:48.284338" elapsed="0.000347"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:48.284309" elapsed="0.000413"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:48.285037" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:48.284802" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:48.284779" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:48.285480" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:48.285227" elapsed="0.000332"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:48.285204" elapsed="0.000389"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:48.282217" elapsed="0.003411"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:48.281848" elapsed="0.003819"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:48.275815" elapsed="0.010000">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:50.289950" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:50.289123" elapsed="0.000902"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:50.290151" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T01:04:50.290583" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:50.288247" elapsed="0.002396"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:50.291650" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:50.291019" elapsed="0.001441">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:50.292921" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:50.293847" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:50.294267" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:50.294736" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:50.295178" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:50.295673" elapsed="0.000050"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:50.296099" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:50.296694" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:50.296299" elapsed="0.000518"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:50.296258" elapsed="0.000615"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:50.297352" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:50.296990" elapsed="0.000514"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:50.296955" elapsed="0.000602"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:50.298031" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:50.297674" elapsed="0.000589"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:50.297640" elapsed="0.000678"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:50.293500" elapsed="0.004870"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:50.293077" elapsed="0.005380"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:50.287126" elapsed="0.011543">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:52.302834" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:52.301974" elapsed="0.000931"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:52.303025" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:04:52.303351" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:52.301101" elapsed="0.002303"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:52.303976" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:52.303629" elapsed="0.000895">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:52.304821" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:52.305408" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:52.305677" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:52.305933" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:52.306191" elapsed="0.000311"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:52.306748" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:52.307009" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:52.307438" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:52.307134" elapsed="0.000382"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:52.307108" elapsed="0.000442"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:52.307859" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:52.307624" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:52.307603" elapsed="0.000365"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:52.308263" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:52.308039" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:52.308018" elapsed="0.000352"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:52.305172" elapsed="0.003251"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:52.304925" elapsed="0.003536"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:52.299984" elapsed="0.008609">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:54.312988" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:54.311944" elapsed="0.001119"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:54.313186" elapsed="0.000099"/>
</return>
<msg time="2026-04-11T01:04:54.313672" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:54.311100" elapsed="0.002628"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:54.314552" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:54.314079" elapsed="0.001022">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:54.315419" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:54.315987" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:54.316253" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:54.316647" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:54.316911" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:54.317173" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:54.317470" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:54.317831" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:54.317600" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:54.317574" elapsed="0.000366"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:54.318234" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:54.318013" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:54.317992" elapsed="0.000348"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:54.318654" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:54.318431" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:54.318408" elapsed="0.000353"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:54.315769" elapsed="0.003024"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:54.315523" elapsed="0.003305"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:54.310034" elapsed="0.008928">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:56.322974" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:56.322189" elapsed="0.000855"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:56.323159" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:04:56.323573" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:56.321342" elapsed="0.002289"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:56.324606" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:56.323984" elapsed="0.001390">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:56.325710" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:56.326298" elapsed="0.000040"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:56.326602" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:56.326921" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:56.327247" elapsed="0.002276"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:56.329785" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:56.330051" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:56.330428" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:56.330178" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:56.330152" elapsed="0.000388"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:56.330837" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:56.330614" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:56.330592" elapsed="0.000353"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:56.331246" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:56.331024" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:56.330998" elapsed="0.000357"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:56.326063" elapsed="0.005343"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:56.325811" elapsed="0.005633"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:56.320267" elapsed="0.011385">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:04:58.335838" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:04:58.335003" elapsed="0.000903"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:04:58.336024" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:04:58.336418" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:04:58.334115" elapsed="0.002372"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:04:58.337429" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:04:58.336857" elapsed="0.001452">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:58.338826" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:58.339910" elapsed="0.000054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:58.340350" elapsed="0.000081"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:58.340809" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:58.341235" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:58.341690" elapsed="0.000049"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:58.342113" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:58.342722" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:58.342317" elapsed="0.000531"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:58.342275" elapsed="0.000628"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:58.343459" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:58.343025" elapsed="0.000572"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:58.342989" elapsed="0.000661"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:04:58.344547" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:04:58.343852" elapsed="0.000778"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:04:58.343814" elapsed="0.000850"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:04:58.339436" elapsed="0.005260"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:04:58.338991" elapsed="0.005743"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:04:58.333014" elapsed="0.011859">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:00.348811" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:00.348039" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:00.348998" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:05:00.349350" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:00.347209" elapsed="0.002234"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:00.350334" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:00.349797" elapsed="0.001357">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:00.351587" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:00.352159" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:00.352447" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:00.352708" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:00.353055" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:00.353315" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:00.353596" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:00.353950" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:00.353720" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:00.353694" elapsed="0.000366"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:00.354356" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:00.354133" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:00.354112" elapsed="0.000384"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:00.354794" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:00.354569" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:00.354547" elapsed="0.000355"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:00.351942" elapsed="0.002991"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:00.351690" elapsed="0.003279"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:00.346152" elapsed="0.008947">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:02.359633" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:02.358862" elapsed="0.000842"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:02.359821" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:05:02.360173" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:02.358027" elapsed="0.002203"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:02.361153" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:02.360613" elapsed="0.001357">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:02.362464" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:02.363053" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:02.363316" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:02.363598" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:02.363856" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:02.364112" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:02.364369" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:02.364738" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:02.364511" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:02.364485" elapsed="0.000363"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:02.365142" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:02.364921" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:02.364899" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:02.365590" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:02.365323" elapsed="0.000344"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:02.365301" elapsed="0.000399"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:02.362836" elapsed="0.002896"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:02.362592" elapsed="0.003175"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:02.356988" elapsed="0.008909">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:04.370025" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:04.369244" elapsed="0.000852"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:04.370213" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:05:04.370602" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:04.368419" elapsed="0.002238"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:04.371578" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:04.371007" elapsed="0.001319">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:04.372868" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:04.373716" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:04.373978" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:04.374234" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:04.374508" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:04.374784" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:04.375057" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:04.375452" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:04.375189" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:04.375160" elapsed="0.000411"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:04.375883" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:04.375649" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:04.375626" elapsed="0.000369"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:04.376304" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:04.376070" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:04.376048" elapsed="0.000388"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:04.373456" elapsed="0.003014"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:04.373029" elapsed="0.003788"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:04.367203" elapsed="0.009825">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:06.381766" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:06.380955" elapsed="0.000880"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:06.381956" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:05:06.382348" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:06.379573" elapsed="0.002875"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:06.383429" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:06.382848" elapsed="0.001344">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:06.384685" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:06.385595" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:06.386018" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:06.386456" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:06.386871" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:06.387280" elapsed="0.000043"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:06.387843" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:06.388427" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:06.388040" elapsed="0.000509"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:06.388000" elapsed="0.000607"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:06.389070" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:06.388721" elapsed="0.000465"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:06.388688" elapsed="0.000549"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:06.389729" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:06.389348" elapsed="0.000500"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:06.389315" elapsed="0.000584"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:06.385227" elapsed="0.004722"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:06.384840" elapsed="0.005164"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:06.378461" elapsed="0.011747">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:08.394210" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:08.393464" elapsed="0.000815"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:08.394426" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:05:08.394831" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:08.392627" elapsed="0.002261"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:08.395776" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:08.395244" elapsed="0.001034">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:08.396621" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:08.397191" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:08.397475" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:08.397735" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:08.397998" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:08.398256" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:08.398553" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:08.398913" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:08.398687" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:08.398658" elapsed="0.000364"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:08.399315" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:08.399094" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:08.399073" elapsed="0.000369"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:08.399733" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:08.399514" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:08.399492" elapsed="0.000348"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:08.396975" elapsed="0.002898"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:08.396724" elapsed="0.003186"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:08.391565" elapsed="0.008476">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:10.404959" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:10.403577" elapsed="0.001456"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:10.405287" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:05:10.405764" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:10.402516" elapsed="0.003310"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:10.406788" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:10.406212" elapsed="0.001088">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:10.407626" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:10.408207" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:10.408489" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:10.408753" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:10.409006" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:10.409262" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:10.409546" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:10.409920" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:10.409687" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:10.409660" elapsed="0.000371"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:10.410327" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:10.410105" elapsed="0.000581"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:10.410084" elapsed="0.000642"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:10.411038" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:10.410806" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:10.410783" elapsed="0.000365"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:10.407993" elapsed="0.003188"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:10.407737" elapsed="0.003481"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:10.401365" elapsed="0.009986">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:12.416008" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:12.415072" elapsed="0.001006"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:12.416199" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:05:12.416685" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:12.414189" elapsed="0.002562"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:12.417738" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:12.417138" elapsed="0.001125">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:12.418584" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:12.419168" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:12.419469" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:12.419766" elapsed="0.000038"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:12.420122" elapsed="0.000038"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:12.420440" elapsed="0.000032"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:12.420769" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:12.421240" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:12.421007" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:12.420978" elapsed="0.000373"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:12.421676" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:12.421451" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:12.421428" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:12.422077" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:12.421857" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:12.421835" elapsed="0.000349"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:12.418948" elapsed="0.003268"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:12.418689" elapsed="0.003564"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:12.412721" elapsed="0.009683">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:14.427182" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:14.426262" elapsed="0.001003"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:14.427427" elapsed="0.000094"/>
</return>
<msg time="2026-04-11T01:05:14.427874" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:14.425323" elapsed="0.002608"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:14.429205" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:14.428292" elapsed="0.001449">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:14.430040" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:14.430640" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:14.430904" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:14.431161" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:14.431443" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:14.431743" elapsed="0.000035"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:14.432017" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:14.432372" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:14.432142" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:14.432115" elapsed="0.000392"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:14.432807" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:14.432581" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:14.432559" elapsed="0.000357"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:14.433215" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:14.432990" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:14.432968" elapsed="0.000355"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:14.430419" elapsed="0.002936"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:14.430143" elapsed="0.003268"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:14.424084" elapsed="0.009463">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:16.437797" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:16.436933" elapsed="0.000937"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:16.438003" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:05:16.438365" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:16.436009" elapsed="0.002444"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:16.439512" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:16.438987" elapsed="0.001033">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:16.440316" elapsed="0.000030"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:16.440925" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:16.441190" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:16.441471" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:16.441729" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:16.441993" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:16.442254" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:16.442630" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:16.442397" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:16.442354" elapsed="0.000401"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:16.443058" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:16.442830" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:16.442808" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:16.443486" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:16.443243" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:16.443217" elapsed="0.000379"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:16.440704" elapsed="0.002924"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:16.440441" elapsed="0.003221"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:16.434925" elapsed="0.008876">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:18.447827" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:18.447045" elapsed="0.000852"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:18.448017" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:05:18.448374" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:18.446204" elapsed="0.002260"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:18.449368" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:18.448822" elapsed="0.001871">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:18.451161" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:18.452104" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:18.452570" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:18.452992" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:18.453435" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:18.453876" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:18.454293" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:18.454895" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:18.454523" elapsed="0.000493"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:18.454481" elapsed="0.000698"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:18.455706" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:18.455310" elapsed="0.000519"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:18.455274" elapsed="0.000609"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:18.456362" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:18.456000" elapsed="0.000514"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:18.455965" elapsed="0.000602"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:18.451750" elapsed="0.004869"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:18.451322" elapsed="0.005352"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:18.445103" elapsed="0.011782">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:20.460914" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:20.460080" elapsed="0.000907"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:20.461105" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:05:20.461504" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:20.459237" elapsed="0.002325"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:20.462500" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:20.461923" elapsed="0.001322">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:20.463739" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:20.464689" elapsed="0.000089"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:20.465107" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:20.465370" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:20.465651" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:20.465910" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:20.466168" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:20.466539" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:20.466293" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:20.466267" elapsed="0.000384"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:20.466945" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:20.466724" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:20.466702" elapsed="0.000353"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:20.467408" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:20.467126" elapsed="0.000364"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:20.467105" elapsed="0.000419"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:20.464308" elapsed="0.003249"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:20.463901" elapsed="0.003692"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:20.458197" elapsed="0.009529">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:22.471625" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:22.470839" elapsed="0.000856"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:22.471847" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:05:22.472236" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:22.470016" elapsed="0.002276"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:22.473228" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:22.472685" elapsed="0.001915">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:22.475185" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:22.476193" elapsed="0.000038"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:22.476490" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:22.476750" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:22.477008" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:22.477264" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:22.477541" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:22.477899" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:22.477671" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:22.477645" elapsed="0.000364"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:22.478307" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:22.478082" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:22.478060" elapsed="0.000374"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:22.478726" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:22.478507" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:22.478485" elapsed="0.000349"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:22.475828" elapsed="0.003037"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:22.475346" elapsed="0.003556"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:22.468988" elapsed="0.010048">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:24.483035" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:24.482227" elapsed="0.000881"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:24.483224" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:05:24.483613" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:24.481378" elapsed="0.002294"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:24.484592" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:24.484024" elapsed="0.001321">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:24.485837" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:24.486768" elapsed="0.000094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:24.487209" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:24.487488" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:24.487746" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:24.488004" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:24.488263" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:24.488637" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:24.488405" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:24.488362" elapsed="0.000384"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:24.489041" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:24.488818" elapsed="0.000389"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:24.488797" elapsed="0.000447"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:24.489567" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:24.489320" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:24.489298" elapsed="0.000379"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:24.486420" elapsed="0.003289"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:24.485996" elapsed="0.003748"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:24.480318" elapsed="0.009557">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:26.494501" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:26.493728" elapsed="0.000824"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:26.494637" elapsed="0.000058"/>
</return>
<msg time="2026-04-11T01:05:26.494869" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:26.492809" elapsed="0.002094"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:26.495491" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:26.495123" elapsed="0.001228">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:26.496673" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:26.497248" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:26.497539" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:26.497805" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:26.498167" elapsed="0.000038"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:26.498476" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:26.498740" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:26.499096" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:26.498866" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:26.498839" elapsed="0.000367"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:26.499520" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:26.499278" elapsed="0.000319"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:26.499257" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:26.499923" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:26.499702" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:26.499680" elapsed="0.000349"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:26.497025" elapsed="0.003036"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:26.496778" elapsed="0.003318"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:26.491613" elapsed="0.008620">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:28.504465" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:28.503638" elapsed="0.000905"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:28.504670" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:05:28.505086" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:28.502745" elapsed="0.002402"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:28.506194" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:28.505636" elapsed="0.001496">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:28.507634" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:28.508813" elapsed="0.000080"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:28.509288" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:28.509740" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:28.510150" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:28.510618" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:28.511030" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:28.511617" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:28.511226" elapsed="0.000512"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:28.511186" elapsed="0.000606"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:28.512256" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:28.511908" elapsed="0.000467"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:28.511875" elapsed="0.000581"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:28.512971" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:28.512572" elapsed="0.000537"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:28.512539" elapsed="0.000621"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:28.508333" elapsed="0.004882"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:28.507798" elapsed="0.005483"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:28.501632" elapsed="0.011833">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:30.517441" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:30.516665" elapsed="0.000849"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:30.517656" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:05:30.518010" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:30.515773" elapsed="0.002292"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:30.518997" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:30.518453" elapsed="0.001976">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:30.520903" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:30.521835" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:30.522264" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:30.522710" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:30.523121" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:30.523563" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:30.523999" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:30.524651" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:30.524195" elapsed="0.000586"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:30.524155" elapsed="0.000680"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:30.525309" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:30.524953" elapsed="0.000506"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:30.524919" elapsed="0.000594"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:30.525988" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:30.525629" elapsed="0.000621"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:30.525595" elapsed="0.000711"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:30.521485" elapsed="0.004872"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:30.521063" elapsed="0.005379"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:30.514739" elapsed="0.011920">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:32.531147" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:32.530623" elapsed="0.000571"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:32.531273" elapsed="0.000054"/>
</return>
<msg time="2026-04-11T01:05:32.531531" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:32.530041" elapsed="0.001537"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:32.532222" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:32.531860" elapsed="0.000916">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:32.533075" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:32.533762" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:32.534034" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:32.534293" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:32.534581" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:32.534843" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:32.535204" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:32.535596" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:32.535339" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:32.535312" elapsed="0.000396"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:32.536005" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:32.535782" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:32.535761" elapsed="0.000351"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:32.536526" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:32.536203" elapsed="0.000429"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:32.536174" elapsed="0.000505"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:32.533522" elapsed="0.003197"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:32.533178" elapsed="0.003577"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:32.529326" elapsed="0.007566">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:34.540748" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:34.539974" elapsed="0.000841"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:34.540933" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:05:34.541276" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:34.539162" elapsed="0.002168"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:34.542339" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:34.541759" elapsed="0.001453">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:34.543544" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:34.544149" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:34.544453" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:34.544832" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:34.545109" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:34.545406" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:34.545687" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:34.546076" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:34.545818" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:34.545791" elapsed="0.000401"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:34.546525" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:34.546268" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:34.546246" elapsed="0.000393"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:34.546948" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:34.546713" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:34.546692" elapsed="0.000372"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:34.543919" elapsed="0.003215"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:34.543651" elapsed="0.003542"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:34.538161" elapsed="0.009209">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:36.551960" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:36.550958" elapsed="0.001100"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:36.552193" elapsed="0.000089"/>
</return>
<msg time="2026-04-11T01:05:36.552629" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:36.549968" elapsed="0.002723"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:36.553654" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:36.553128" elapsed="0.001084">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:36.554547" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:36.555201" elapsed="0.000038"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:36.555560" elapsed="0.000037"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:36.555836" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:36.556097" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:36.556351" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:36.556638" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:36.557028" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:36.556768" elapsed="0.000340"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:36.556740" elapsed="0.000402"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:36.557493" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:36.557217" elapsed="0.000361"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:36.557196" elapsed="0.000416"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:36.557907" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:36.557684" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:36.557662" elapsed="0.000351"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:36.554962" elapsed="0.003082"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:36.554657" elapsed="0.003424"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:36.548785" elapsed="0.009523">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:38.562358" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:38.561553" elapsed="0.000948"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:38.562640" elapsed="0.000090"/>
</return>
<msg time="2026-04-11T01:05:38.563026" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:38.560695" elapsed="0.002390"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:38.564108" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:38.563501" elapsed="0.001935">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:38.565938" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:38.566976" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:38.567462" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:38.567918" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:38.568424" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:38.568912" elapsed="0.000048"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:38.569359" elapsed="0.000076"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:38.570036" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:38.569615" elapsed="0.000549"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:38.569565" elapsed="0.000656"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:38.570765" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:38.570345" elapsed="0.000548"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:38.570309" elapsed="0.000639"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:38.571480" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:38.571070" elapsed="0.000540"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:38.571035" elapsed="0.000630"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:38.566574" elapsed="0.005145"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:38.566106" elapsed="0.005675"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:38.559596" elapsed="0.012409">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:40.577000" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:40.575902" elapsed="0.001176"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:40.577206" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:05:40.577667" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:40.574653" elapsed="0.003079"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:40.578817" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:40.578112" elapsed="0.001650">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:40.580257" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:40.581273" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:40.581760" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:40.582207" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:40.582824" elapsed="0.000067"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:40.583429" elapsed="0.000060"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:40.583907" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:40.584557" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:40.584120" elapsed="0.000571"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:40.584076" elapsed="0.000674"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:40.585265" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:40.584877" elapsed="0.000547"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:40.584840" elapsed="0.000645"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:40.586040" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:40.585613" elapsed="0.000563"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:40.585576" elapsed="0.000654"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:40.580897" elapsed="0.005387"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:40.580463" elapsed="0.005882"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:40.573470" elapsed="0.013140">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:42.590756" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:42.589908" elapsed="0.000919"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:42.590946" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:05:42.591296" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:42.589074" elapsed="0.002279"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:42.592279" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:42.591741" elapsed="0.001837">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:42.594055" elapsed="0.000080"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:42.595043" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:42.595504" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:42.595928" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:42.596348" elapsed="0.000075"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:42.596801" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:42.597221" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:42.597876" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:42.597499" elapsed="0.000507"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:42.597450" elapsed="0.000611"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:42.598621" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:42.598224" elapsed="0.000525"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:42.598186" elapsed="0.000617"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:42.599281" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:42.598918" elapsed="0.000515"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:42.598884" elapsed="0.000604"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:42.594688" elapsed="0.004851"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:42.594260" elapsed="0.005337"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:42.588008" elapsed="0.011801">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:44.604365" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:44.603585" elapsed="0.000885"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:44.604598" elapsed="0.000103"/>
</return>
<msg time="2026-04-11T01:05:44.605072" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:44.602617" elapsed="0.002693"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:44.606424" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:44.605835" elapsed="0.001397">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:44.607745" elapsed="0.000065"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:44.608735" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:44.609219" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:44.609674" elapsed="0.000059"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:44.610006" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:44.610206" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:44.610428" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:44.610715" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:44.610540" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:44.610515" elapsed="0.000282"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:44.611013" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:44.610852" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:44.610836" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:44.611303" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:44.611144" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:44.611129" elapsed="0.000252"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:44.608340" elapsed="0.003080"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:44.607925" elapsed="0.003522"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:44.601377" elapsed="0.010170">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:46.615807" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:46.614928" elapsed="0.000949"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:46.615997" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:05:46.616422" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:46.614016" elapsed="0.002466"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:46.617537" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:46.616936" elapsed="0.004944">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:46.622355" elapsed="0.000086"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:46.623525" elapsed="0.000054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:46.623950" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:46.624206" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:46.624478" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:46.624736" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:46.625099" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:46.625475" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:46.625226" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:46.625200" elapsed="0.000387"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:46.625879" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:46.625660" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:46.625639" elapsed="0.000348"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:46.626277" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:46.626057" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:46.626036" elapsed="0.000365"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:46.623059" elapsed="0.003376"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:46.622592" elapsed="0.003881"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:46.612942" elapsed="0.013670">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:48.630836" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:48.630023" elapsed="0.000884"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:48.631028" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:05:48.631456" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:48.629066" elapsed="0.002455"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:48.632503" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:48.631881" elapsed="0.001396">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:48.633960" elapsed="0.000057"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:48.634884" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:48.635086" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:48.635288" elapsed="0.000023"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:48.635534" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:48.635773" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:48.636035" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:48.636316" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:48.636147" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:48.636126" elapsed="0.000287"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:48.636633" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:48.636471" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:48.636455" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:48.636924" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:48.636765" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:48.636749" elapsed="0.000253"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:48.634575" elapsed="0.002450"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:48.634137" elapsed="0.002915"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:48.627936" elapsed="0.009218">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:50.641107" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:50.640324" elapsed="0.000853"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:50.641444" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T01:05:50.641813" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:50.639482" elapsed="0.002388"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:50.642801" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:50.642225" elapsed="0.001362">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:50.644137" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:50.645007" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:50.645273" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:50.645551" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:50.645806" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:50.646060" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:50.646316" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:50.647000" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:50.646756" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:50.646434" elapsed="0.000681"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:50.647437" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:50.647190" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:50.647168" elapsed="0.000378"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:50.647865" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:50.647620" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:50.647598" elapsed="0.000375"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:50.644729" elapsed="0.003276"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:50.644299" elapsed="0.003743"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:50.638443" elapsed="0.009731">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:52.651108" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:52.650612" elapsed="0.000543"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:52.651234" elapsed="0.000056"/>
</return>
<msg time="2026-04-11T01:05:52.651489" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:52.650060" elapsed="0.001465"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:52.652092" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:52.651746" elapsed="0.000869">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:52.652911" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:52.653519" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:52.653786" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:52.654045" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:52.654301" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:52.654578" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:52.654841" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:52.655286" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:52.655053" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:52.655025" elapsed="0.000390"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:52.655716" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:52.655493" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:52.655471" elapsed="0.000351"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:52.656115" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:52.655893" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:52.655872" elapsed="0.000349"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:52.653266" elapsed="0.002987"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:52.653012" elapsed="0.003277"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:52.649296" elapsed="0.007144">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:54.660332" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:54.659587" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:54.660551" elapsed="0.000116"/>
</return>
<msg time="2026-04-11T01:05:54.661011" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:54.658739" elapsed="0.002329"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:54.662007" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:54.661459" elapsed="0.001327">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:54.663311" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:54.664167" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:54.664449" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:54.664710" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:54.664965" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:54.665222" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:54.665501" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:54.665857" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:54.665627" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:54.665601" elapsed="0.000367"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:54.666264" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:54.666041" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:54.666020" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:54.666691" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:54.666468" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:54.666445" elapsed="0.000353"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:54.663898" elapsed="0.002932"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:54.663503" elapsed="0.003375"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:54.657711" elapsed="0.009302">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:56.671634" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:56.670857" elapsed="0.000857"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:56.671841" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:05:56.672250" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:56.670007" elapsed="0.002294"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:56.672976" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:56.672628" elapsed="0.000866">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:56.673789" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:56.674356" elapsed="0.000053"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:56.674651" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:56.674911" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:56.675169" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:56.675444" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:56.675704" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:56.676090" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:56.675828" elapsed="0.000340"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:56.675802" elapsed="0.000400"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:56.676526" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:56.676277" elapsed="0.000332"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:56.676255" elapsed="0.000387"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:56.676940" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:56.676715" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:56.676694" elapsed="0.000356"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:56.674138" elapsed="0.002943"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:56.673889" elapsed="0.003228"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:56.668970" elapsed="0.008278">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:05:58.681300" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:05:58.680490" elapsed="0.000879"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:05:58.681526" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:05:58.681912" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:05:58.679633" elapsed="0.002339"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:05:58.682923" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:05:58.682328" elapsed="0.001422">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:58.684243" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:58.685219" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:58.685584" elapsed="0.000039"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:58.685878" elapsed="0.000054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:58.686194" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:58.686511" elapsed="0.000032"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:58.686794" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:58.687186" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:58.686939" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:58.686902" elapsed="0.000525"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:58.687759" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:58.687520" elapsed="0.000319"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:58.687495" elapsed="0.000379"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:05:58.688200" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:05:58.687962" elapsed="0.000319"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:05:58.687934" elapsed="0.000382"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:05:58.684840" elapsed="0.003510"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:05:58.684437" elapsed="0.003973"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:05:58.678559" elapsed="0.010000">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:00.693097" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:00.692294" elapsed="0.000873"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:00.693309" elapsed="0.000164"/>
</return>
<msg time="2026-04-11T01:06:00.693931" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:00.691438" elapsed="0.002557"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:00.694684" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:00.694304" elapsed="0.000889">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:00.695521" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:00.696094" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:00.696360" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:00.696641" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:00.696897" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:00.697152" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:00.697426" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:00.697801" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:00.697572" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:00.697544" elapsed="0.000368"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:00.698212" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:00.697984" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:00.697964" elapsed="0.000358"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:00.698646" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:00.698412" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:00.698373" elapsed="0.000383"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:00.695874" elapsed="0.002914"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:00.695625" elapsed="0.003199"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:00.689887" elapsed="0.009069">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:02.703461" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:02.702584" elapsed="0.000956"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:02.703669" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:06:02.704072" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:02.701626" elapsed="0.002509"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:02.705180" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:02.704558" elapsed="0.001500">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:02.706738" elapsed="0.000058"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:02.707793" elapsed="0.000056"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:02.708287" elapsed="0.000054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:02.708786" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:02.709267" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:02.709760" elapsed="0.000098"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:02.710309" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:02.710598" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:02.710430" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:02.710409" elapsed="0.000271"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:02.710894" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:02.710733" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:02.710718" elapsed="0.000253"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:02.711179" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:02.711023" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:02.711008" elapsed="0.000253"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:02.707380" elapsed="0.003903"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:02.706918" elapsed="0.004391"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:02.700366" elapsed="0.011058">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:04.716080" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:04.714780" elapsed="0.001371"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:04.716271" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:06:04.716666" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:04.713913" elapsed="0.002809"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:04.717657" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:04.717081" elapsed="0.001406">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:04.718950" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:04.719724" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:04.719994" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:04.720256" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:04.720537" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:04.720797" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:04.721055" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:04.721432" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:04.721181" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:04.721153" elapsed="0.000392"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:04.721846" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:04.721621" elapsed="0.000383"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:04.721599" elapsed="0.000443"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:04.722364" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:04.722118" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:04.722096" elapsed="0.000399"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:04.719503" elapsed="0.003024"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:04.719111" elapsed="0.003452"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:04.712861" elapsed="0.009834">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:06.727183" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:06.726364" elapsed="0.000895"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:06.727412" elapsed="0.000089"/>
</return>
<msg time="2026-04-11T01:06:06.727791" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:06.725498" elapsed="0.002349"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:06.728799" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:06.728204" elapsed="0.001443">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:06.730119" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:06.731100" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:06.731625" elapsed="0.000054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:06.732060" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:06.732516" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:06.732945" elapsed="0.000049"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:06.733371" elapsed="0.000078"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:06.733977" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:06.733609" elapsed="0.000492"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:06.733564" elapsed="0.000592"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:06.734785" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:06.734275" elapsed="0.000647"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:06.734241" elapsed="0.000736"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:06.735481" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:06.735099" elapsed="0.000463"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:06.735063" elapsed="0.000533"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:06.730746" elapsed="0.004881"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:06.730284" elapsed="0.005379"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:06.724296" elapsed="0.011508">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:08.740000" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:08.739186" elapsed="0.000882"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:08.740184" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:06:08.740596" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:08.738240" elapsed="0.002414"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:08.742072" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:08.741007" elapsed="0.001859">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:08.743328" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:08.744439" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:08.744878" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:08.745302" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:08.745760" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:08.746176" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:08.746677" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:08.747247" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:08.746880" elapsed="0.000489"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:08.746839" elapsed="0.000616"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:08.747938" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:08.747578" elapsed="0.000484"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:08.747542" elapsed="0.000573"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:08.748623" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:08.748233" elapsed="0.000513"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:08.748197" elapsed="0.000600"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:08.744055" elapsed="0.004794"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:08.743523" elapsed="0.005382"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:08.737157" elapsed="0.011956">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:10.753228" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:10.752476" elapsed="0.000822"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:10.753447" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:06:10.753808" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:10.751642" elapsed="0.002223"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:10.754838" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:10.754319" elapsed="0.001035">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:10.755675" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:10.756247" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:10.756538" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:10.756797" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:10.757054" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:10.757310" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:10.757588" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:10.757939" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:10.757713" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:10.757687" elapsed="0.000387"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:10.758533" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:10.758148" elapsed="0.000474"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:10.758127" elapsed="0.000526"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:10.758944" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:10.758725" elapsed="0.000403"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:10.758705" elapsed="0.000458"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:10.756029" elapsed="0.003166"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:10.755779" elapsed="0.003451"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:10.750590" elapsed="0.008777">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:12.763507" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:12.762736" elapsed="0.000849"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:12.763714" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:06:12.764067" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:12.761828" elapsed="0.002295"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:12.765546" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:12.764508" elapsed="0.001851">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:12.766864" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:12.767819" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:12.768248" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:12.768720" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:12.769141" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:12.769598" elapsed="0.000053"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:12.770079" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:12.770692" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:12.770281" elapsed="0.000481"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:12.770239" elapsed="0.000547"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:12.771001" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:12.770840" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:12.770825" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:12.771292" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:12.771132" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:12.771116" elapsed="0.000253"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:12.767468" elapsed="0.003940"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:12.767025" elapsed="0.004411"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:12.760746" elapsed="0.010787">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:14.775506" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:14.774734" elapsed="0.000845"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:14.775698" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:06:14.776050" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:14.773905" elapsed="0.002207"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:14.777112" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:14.776532" elapsed="0.001397">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:14.778427" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:14.779328" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:14.779788" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:14.780345" elapsed="0.000076"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:14.780802" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:14.781222" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:14.781717" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:14.782296" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:14.781925" elapsed="0.000523"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:14.781883" elapsed="0.000621"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:14.782879" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:14.782643" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:14.782602" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:14.783172" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:14.783011" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:14.782995" elapsed="0.000255"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:14.778981" elapsed="0.004291"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:14.778589" elapsed="0.004710"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:14.772808" elapsed="0.010602">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:16.787420" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:16.786655" elapsed="0.000838"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:16.787609" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:06:16.787960" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:16.785828" elapsed="0.002188"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:16.788937" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:16.788364" elapsed="0.001712">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:16.790377" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:16.790970" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:16.791231" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:16.791504" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:16.791762" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:16.792017" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:16.792270" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:16.792652" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:16.792415" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:16.792370" elapsed="0.000391"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:16.793056" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:16.792835" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:16.792813" elapsed="0.000349"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:16.793490" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:16.793249" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:16.793212" elapsed="0.000385"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:16.790750" elapsed="0.002878"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:16.790501" elapsed="0.003163"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:16.784734" elapsed="0.009154">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:18.797820" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:18.797048" elapsed="0.000842"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:18.798009" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:06:18.798361" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:18.796182" elapsed="0.002265"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:18.799340" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:18.798802" elapsed="0.001318">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:18.800604" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:18.801551" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:18.801971" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:18.802374" elapsed="0.000072"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:18.802811" elapsed="0.000043"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:18.803216" elapsed="0.000043"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:18.803660" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:18.804226" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:18.803862" elapsed="0.000481"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:18.803821" elapsed="0.000605"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:18.804921" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:18.804549" elapsed="0.000492"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:18.804514" elapsed="0.000578"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:18.805587" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:18.805205" elapsed="0.000513"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:18.805172" elapsed="0.000605"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:18.801175" elapsed="0.004659"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:18.800780" elapsed="0.005119"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:18.795124" elapsed="0.010988">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:20.810415" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:20.809448" elapsed="0.001042"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:20.810606" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:06:20.810960" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:20.808617" elapsed="0.002401"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:20.811947" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:20.811374" elapsed="0.001701">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:20.813405" elapsed="0.000035"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:20.813982" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:20.814250" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:20.814531" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:20.814881" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:20.815146" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:20.815427" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:20.815784" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:20.815553" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:20.815527" elapsed="0.000367"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:20.816190" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:20.815967" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:20.815945" elapsed="0.000387"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:20.816653" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:20.816427" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:20.816403" elapsed="0.000359"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:20.813765" elapsed="0.003029"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:20.813512" elapsed="0.003318"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:20.807490" elapsed="0.009472">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:22.820880" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:22.820108" elapsed="0.000841"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:22.821067" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T01:06:22.821450" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:22.819258" elapsed="0.002251"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:22.822429" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:22.821864" elapsed="0.001308">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:22.823673" elapsed="0.000060"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:22.824611" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:22.825039" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:22.825478" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:22.825903" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:22.826319" elapsed="0.000044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:22.826764" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:22.827318" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:22.826958" elapsed="0.000510"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:22.826918" elapsed="0.000605"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:22.828048" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:22.827641" elapsed="0.000529"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:22.827606" elapsed="0.000616"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:22.828730" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:22.828337" elapsed="0.000498"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:22.828302" elapsed="0.000557"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:22.824234" elapsed="0.004648"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:22.823843" elapsed="0.005065"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:22.818212" elapsed="0.010789">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:24.833338" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:24.832586" elapsed="0.000848"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:24.833554" elapsed="0.000090"/>
</return>
<msg time="2026-04-11T01:06:24.833920" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:24.831720" elapsed="0.002255"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:24.834903" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:24.834323" elapsed="0.001720">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:24.836358" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:24.836983" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:24.837268" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:24.837566" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:24.837845" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:24.838145" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:24.838438" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:24.838815" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:24.838572" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:24.838545" elapsed="0.000401"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:24.839275" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:24.839041" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:24.839007" elapsed="0.000398"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:24.839715" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:24.839483" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:24.839461" elapsed="0.000366"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:24.836750" elapsed="0.003110"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:24.836486" elapsed="0.003412"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:24.830247" elapsed="0.009790">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:26.844604" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:26.843821" elapsed="0.000854"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:26.844794" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:06:26.845152" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:26.842817" elapsed="0.002390"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:26.846132" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:26.845588" elapsed="0.001349">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:26.847435" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:26.848351" elapsed="0.000079"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:26.848811" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:26.849225" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:26.849664" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:26.850107" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:26.850734" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:26.851311" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:26.850942" elapsed="0.000530"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:26.850901" elapsed="0.000630"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:26.852038" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:26.851676" elapsed="0.000483"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:26.851639" elapsed="0.000571"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:26.852930" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:26.852356" elapsed="0.000705"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:26.852310" elapsed="0.000802"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:26.848002" elapsed="0.005182"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:26.847598" elapsed="0.005647"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:26.841328" elapsed="0.012164">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:28.857629" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:28.856773" elapsed="0.000981"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:28.857873" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:06:28.858144" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:28.855937" elapsed="0.002242"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:28.858771" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:28.858422" elapsed="0.001179">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:28.859900" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:28.860484" elapsed="0.000034"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:28.860781" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:28.861048" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:28.861308" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:28.861589" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:28.861919" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:28.862283" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:28.862054" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:28.862028" elapsed="0.000387"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:28.862715" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:28.862492" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:28.862470" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:28.863115" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:28.862894" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:28.862873" elapsed="0.000349"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:28.860247" elapsed="0.003007"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:28.860000" elapsed="0.003290"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:28.854882" elapsed="0.008558">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:30.867536" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:30.866664" elapsed="0.000946"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:30.867874" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T01:06:30.868303" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:30.865778" elapsed="0.002587"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:30.869439" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:30.868770" elapsed="0.001442">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:30.870714" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:30.871654" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:30.872089" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:30.872541" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:30.873082" elapsed="0.000060"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:30.873582" elapsed="0.000049"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:30.874006" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:30.874440" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:30.874192" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:30.874160" elapsed="0.000393"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:30.874847" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:30.874627" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:30.874605" elapsed="0.000350"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:30.875249" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:30.875032" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:30.875005" elapsed="0.000349"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:30.871272" elapsed="0.004132"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:30.870879" elapsed="0.004571"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:30.864677" elapsed="0.010907">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:32.879579" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:32.878816" elapsed="0.000834"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:32.879766" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:06:32.880116" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:32.877996" elapsed="0.002207"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:32.881136" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:32.880595" elapsed="0.001742">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:32.882834" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:32.883761" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:32.884231" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:32.884679" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:32.885093" elapsed="0.000039"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:32.885300" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:32.885498" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:32.885831" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:32.885662" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:32.885642" elapsed="0.000269"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:32.886131" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:32.885965" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:32.885949" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:32.886435" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:32.886261" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:32.886245" elapsed="0.000269"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:32.883410" elapsed="0.003127"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:32.882992" elapsed="0.003571"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:32.876945" elapsed="0.009713">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:34.889733" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:34.889031" elapsed="0.000755"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:34.889873" elapsed="0.000064"/>
</return>
<msg time="2026-04-11T01:06:34.890118" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:34.888376" elapsed="0.001777"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:34.890757" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:34.890376" elapsed="0.000929">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:34.891717" elapsed="0.000045"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:34.892436" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:34.892723" elapsed="0.000034"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:34.893027" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:34.893336" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:34.893667" elapsed="0.000034"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:34.893943" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:34.894340" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:34.894075" elapsed="0.000371"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:34.894044" elapsed="0.000438"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:34.894781" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:34.894557" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:34.894536" elapsed="0.000349"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:34.895181" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:34.894956" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:34.894935" elapsed="0.000349"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:34.892182" elapsed="0.003133"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:34.891859" elapsed="0.003552"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:34.887600" elapsed="0.007956">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:36.900497" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:36.899803" elapsed="0.000751"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:36.900658" elapsed="0.000071"/>
</return>
<msg time="2026-04-11T01:06:36.900951" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:36.899125" elapsed="0.001865"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:36.901879" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:36.901447" elapsed="0.003978">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:36.905799" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:36.906468" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:36.906771" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:36.907032" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:36.907323" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:36.907619" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:36.907892" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:36.908268" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:36.908025" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:36.907996" elapsed="0.000415"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:36.908736" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:36.908497" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:36.908474" elapsed="0.000378"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:36.909165" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:36.908928" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:36.908905" elapsed="0.000373"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:36.906192" elapsed="0.003120"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:36.905925" elapsed="0.003436"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:36.897727" elapsed="0.011799">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:38.914048" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:38.912927" elapsed="0.001216"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:38.914308" elapsed="0.000120"/>
</return>
<msg time="2026-04-11T01:06:38.914692" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:38.912022" elapsed="0.002717"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:38.915440" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:38.915029" elapsed="0.000948">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:38.916282" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:38.916925" elapsed="0.000040"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:38.917259" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:38.917549" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:38.917855" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:38.918120" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:38.918414" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:38.918783" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:38.918550" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:38.918524" elapsed="0.000473"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:38.919371" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:38.919102" elapsed="0.000376"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:38.919078" elapsed="0.000435"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:38.919812" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:38.919588" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:38.919566" elapsed="0.000352"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:38.916657" elapsed="0.003293"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:38.916405" elapsed="0.003583"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:38.910954" elapsed="0.009170">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:40.924164" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:40.923367" elapsed="0.000866"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:40.924350" elapsed="0.000115"/>
</return>
<msg time="2026-04-11T01:06:40.924743" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:40.922565" elapsed="0.002236"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:40.925679" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:40.925223" elapsed="0.000975">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:40.926518" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:40.927084" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:40.927350" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:40.927632" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:40.927889" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:40.928147" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:40.928427" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:40.929122" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:40.928875" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:40.928529" elapsed="0.000707"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:40.929558" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:40.929311" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:40.929289" elapsed="0.000380"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:40.929968" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:40.929743" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:40.929721" elapsed="0.000355"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:40.926869" elapsed="0.003239"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:40.926620" elapsed="0.003524"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:40.921502" elapsed="0.008774">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:42.934167" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:42.933429" elapsed="0.000809"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:42.934354" elapsed="0.000111"/>
</return>
<msg time="2026-04-11T01:06:42.934742" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:42.932611" elapsed="0.002187"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:42.935726" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:42.935147" elapsed="0.001352">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:42.936895" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:42.937483" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:42.937750" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:42.938007" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:42.938266" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:42.938542" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:42.938802" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:42.939156" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:42.938927" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:42.938901" elapsed="0.000365"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:42.939583" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:42.939339" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:42.939318" elapsed="0.000375"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:42.940041" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:42.939766" elapsed="0.000362"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:42.939744" elapsed="0.000417"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:42.937244" elapsed="0.002949"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:42.936995" elapsed="0.003234"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:42.931560" elapsed="0.008804">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:44.944429" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:44.943659" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:44.944622" elapsed="0.000107"/>
</return>
<msg time="2026-04-11T01:06:44.945010" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:44.942777" elapsed="0.002290"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:44.946015" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:44.945459" elapsed="0.001346">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:44.947346" elapsed="0.000084"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:44.947985" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:44.948251" elapsed="0.000037"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:44.948538" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:44.948802" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:44.949059" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:44.949318" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:44.949693" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:44.949464" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:44.949436" elapsed="0.000369"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:44.950099" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:44.949877" elapsed="0.000387"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:44.949856" elapsed="0.000445"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:44.950625" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:44.950377" elapsed="0.000335"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:44.950355" elapsed="0.000393"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:44.947766" elapsed="0.003019"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:44.947508" elapsed="0.003316"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:44.941662" elapsed="0.009310">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:46.955205" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:46.954722" elapsed="0.000529"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:46.955331" elapsed="0.000074"/>
</return>
<msg time="2026-04-11T01:06:46.955583" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:46.953899" elapsed="0.001719"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:46.956181" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:46.955837" elapsed="0.000872">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:46.957005" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:46.957595" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:46.957861" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:46.958115" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:46.958416" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:46.958675" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:46.958932" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:46.959288" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:46.959056" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:46.959029" elapsed="0.000389"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:46.959719" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:46.959495" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:46.959473" elapsed="0.000352"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:46.960116" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:46.959896" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:46.959874" elapsed="0.000348"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:46.957356" elapsed="0.002898"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:46.957105" elapsed="0.003186"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:46.952868" elapsed="0.007577">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:48.964730" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:48.963957" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:48.964919" elapsed="0.000096"/>
</return>
<msg time="2026-04-11T01:06:48.965341" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:48.963108" elapsed="0.002331"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:48.966126" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:48.965768" elapsed="0.000892">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:48.966954" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:48.967656" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:48.967922" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:48.968177" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:48.968452" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:48.968711" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:48.968970" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:48.969332" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:48.969094" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:48.969069" elapsed="0.000395"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:48.969767" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:48.969539" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:48.969517" elapsed="0.000361"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:48.970180" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:48.969952" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:48.969930" elapsed="0.000358"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:48.967434" elapsed="0.002887"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:48.967052" elapsed="0.003305"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:48.961997" elapsed="0.008516">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:50.975059" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:50.974275" elapsed="0.000854"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:50.975249" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:06:50.975640" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:50.973454" elapsed="0.002242"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:50.976689" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:50.976047" elapsed="0.001164">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:50.977551" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:50.978122" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:50.978407" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:50.978672" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:50.978931" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:50.979191" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:50.979468" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:50.979823" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:50.979596" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:50.979568" elapsed="0.000365"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:50.980227" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:50.980006" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:50.979985" elapsed="0.000364"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:50.980696" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:50.980449" elapsed="0.000429"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:50.980427" elapsed="0.000486"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:50.977905" elapsed="0.003042"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:50.977654" elapsed="0.003332"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:50.971810" elapsed="0.009317">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:52.985077" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:52.984304" elapsed="0.000843"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:52.985265" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:06:52.985656" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:52.983495" elapsed="0.002221"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:52.986640" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:52.986069" elapsed="0.001397">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:52.987863" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:52.988459" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:52.988727" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:52.988988" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:52.989245" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:52.989522" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:52.989785" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:52.990142" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:52.989911" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:52.989883" elapsed="0.000371"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:52.990574" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:52.990327" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:52.990306" elapsed="0.000380"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:52.990984" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:52.990759" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:52.990737" elapsed="0.000356"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:52.988220" elapsed="0.002906"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:52.987962" elapsed="0.003200"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:52.982414" elapsed="0.008880">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:54.994733" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:54.993729" elapsed="0.001054"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:54.994870" elapsed="0.000064"/>
</return>
<msg time="2026-04-11T01:06:54.995132" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:54.993162" elapsed="0.002008"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:54.995796" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:54.995430" elapsed="0.000932">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:54.996693" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:54.997321" elapsed="0.000035"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:54.997634" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:54.998002" elapsed="0.000034"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:54.998281" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:54.998582" elapsed="0.000032"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:54.998859" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:54.999235" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:54.998992" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:54.998964" elapsed="0.000384"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:54.999682" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:54.999442" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:54.999418" elapsed="0.000377"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:55.000107" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:54.999871" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:54.999848" elapsed="0.000371"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:54.997084" elapsed="0.003172"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:54.996806" elapsed="0.003490"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:54.992316" elapsed="0.008149">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:57.003339" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:57.002854" elapsed="0.000550"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:57.003484" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T01:06:57.003714" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:57.002287" elapsed="0.001463"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:57.004349" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:57.003970" elapsed="0.000910">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:57.005174" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:57.005797" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:57.006062" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:57.006322" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:57.006606" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:57.006863" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:57.007121" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:57.007495" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:57.007246" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:57.007220" elapsed="0.000385"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:57.007898" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:57.007678" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:57.007656" elapsed="0.000351"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:57.008300" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:57.008078" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:57.008056" elapsed="0.000371"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:57.005578" elapsed="0.002881"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:57.005273" elapsed="0.003222"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:57.001572" elapsed="0.007143">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:06:59.012792" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:06:59.012005" elapsed="0.000856"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:06:59.012981" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:06:59.013334" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:06:59.011173" elapsed="0.002247"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:06:59.014831" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:06:59.013779" elapsed="0.001834">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:59.016074" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:59.016984" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:59.017254" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:59.017544" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:59.017810" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:59.018074" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:59.018334" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:59.018733" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:59.018502" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:59.018475" elapsed="0.000367"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:59.019137" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:59.018916" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:59.018895" elapsed="0.000349"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:06:59.019557" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:06:59.019316" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:06:59.019295" elapsed="0.000370"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:06:59.016708" elapsed="0.002988"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:06:59.016230" elapsed="0.003501"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:06:59.010063" elapsed="0.009802">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:01.023977" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:01.023068" elapsed="0.000966"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:01.024114" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T01:07:01.024344" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:01.022234" elapsed="0.002146"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:01.024981" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:01.024633" elapsed="0.000871">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:01.025799" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:01.026367" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:01.026656" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:01.026914" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:01.027276" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:01.027838" elapsed="0.000050"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:01.028146" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:01.028539" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:01.028285" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:01.028254" elapsed="0.000400"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:01.028959" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:01.028729" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:01.028707" elapsed="0.000361"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:01.029363" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:01.029140" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:01.029119" elapsed="0.000374"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:01.026147" elapsed="0.003379"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:01.025899" elapsed="0.003672"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:01.021192" elapsed="0.008527">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:03.033833" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:03.032995" elapsed="0.000910"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:03.034023" elapsed="0.000121"/>
</return>
<msg time="2026-04-11T01:07:03.034459" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:03.032144" elapsed="0.002416"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:03.035712" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:03.034941" elapsed="0.001362">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:03.036648" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:03.037284" elapsed="0.000035"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:03.037613" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:03.037876" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:03.038152" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:03.038459" elapsed="0.000067"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:03.038792" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:03.039208" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:03.038941" elapsed="0.000360"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:03.038910" elapsed="0.000427"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:03.039710" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:03.039452" elapsed="0.000348"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:03.039420" elapsed="0.000416"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:03.040183" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:03.039934" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:03.039902" elapsed="0.000394"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:03.037028" elapsed="0.003306"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:03.036751" elapsed="0.003623"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:03.031039" elapsed="0.009514">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:05.043565" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:05.043026" elapsed="0.000588"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:05.043696" elapsed="0.000056"/>
</return>
<msg time="2026-04-11T01:07:05.043929" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:05.042511" elapsed="0.001455"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:05.044581" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:05.044191" elapsed="0.000907">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:05.045415" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:05.046043" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:05.046312" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:05.046651" elapsed="0.000036"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:05.046925" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:05.047182" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:05.047461" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:05.047846" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:05.047613" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:05.047583" elapsed="0.000375"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:05.048256" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:05.048036" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:05.048013" elapsed="0.000349"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:05.048690" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:05.048458" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:05.048435" elapsed="0.000365"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:05.045820" elapsed="0.003011"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:05.045530" elapsed="0.003338"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:05.041628" elapsed="0.007373">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:07.052940" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:07.052140" elapsed="0.000870"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:07.053129" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:07:07.053514" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:07.051289" elapsed="0.002281"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:07.054489" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:07.053921" elapsed="0.001792">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:07.056176" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:07.057177" elapsed="0.000037"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:07.057479" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:07.057741" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:07.058000" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:07.058260" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:07.058633" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:07.058989" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:07.058760" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:07.058733" elapsed="0.000364"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:07.059412" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:07.059170" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:07.059149" elapsed="0.000374"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:07.059866" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:07.059615" elapsed="0.000332"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:07.059577" elapsed="0.000403"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:07.056811" elapsed="0.003201"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:07.056332" elapsed="0.003715"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:07.050246" elapsed="0.009932">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:09.064423" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:09.063522" elapsed="0.000994"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:09.064641" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T01:07:09.065004" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:09.062581" elapsed="0.002477"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:09.066037" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:09.065445" elapsed="0.001404">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:09.067316" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:09.068273" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:09.068729" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:09.069142" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:09.069585" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:09.069997" elapsed="0.000044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:09.070437" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:09.070997" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:09.070634" elapsed="0.000482"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:09.070594" elapsed="0.000575"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:09.071690" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:09.071288" elapsed="0.000524"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:09.071254" elapsed="0.000609"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:09.072325" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:09.071977" elapsed="0.000497"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:09.071944" elapsed="0.000583"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:09.067925" elapsed="0.004651"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:09.067509" elapsed="0.005121"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:09.061487" elapsed="0.011350">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:11.077340" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:11.076523" elapsed="0.000922"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:11.077722" elapsed="0.000091"/>
</return>
<msg time="2026-04-11T01:07:11.078118" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:11.075560" elapsed="0.002618"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:11.079200" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:11.078589" elapsed="0.002067">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:11.081162" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:11.082168" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:11.082710" elapsed="0.000052"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:11.083168" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:11.083642" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:11.084087" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:11.084557" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:11.085160" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:11.084768" elapsed="0.000519"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:11.084725" elapsed="0.000621"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:11.085888" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:11.085505" elapsed="0.000509"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:11.085467" elapsed="0.000602"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:11.086601" elapsed="0.000089"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:11.086189" elapsed="0.000588"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:11.086154" elapsed="0.000679"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:11.081792" elapsed="0.005097"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:11.081333" elapsed="0.005639"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:11.074264" elapsed="0.012955">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:13.091755" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:13.090931" elapsed="0.000896"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:13.091957" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:07:13.092364" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:13.090094" elapsed="0.002363"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:13.093377" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:13.092819" elapsed="0.001400">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:13.094586" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:13.095159" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:13.095440" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:13.095699" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:13.095952" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:13.096223" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:13.096505" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:13.096976" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:13.096739" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:13.096709" elapsed="0.000379"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:13.097402" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:13.097162" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:13.097141" elapsed="0.000371"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:13.097834" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:13.097584" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:13.097563" elapsed="0.000382"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:13.094939" elapsed="0.003037"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:13.094688" elapsed="0.003326"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:13.088942" elapsed="0.009207">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:15.102069" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:15.101567" elapsed="0.000549"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:15.102198" elapsed="0.000056"/>
</return>
<msg time="2026-04-11T01:07:15.102448" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:15.100810" elapsed="0.001675"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:15.103054" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:15.102707" elapsed="0.001171">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:15.104180" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:15.104819" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:15.105126" elapsed="0.000035"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:15.105426" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:15.105688" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:15.105944" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:15.106252" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:15.106647" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:15.106412" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:15.106364" elapsed="0.000395"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:15.107109" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:15.106832" elapsed="0.000363"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:15.106811" elapsed="0.000416"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:15.107610" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:15.107331" elapsed="0.000359"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:15.107291" elapsed="0.000432"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:15.104573" elapsed="0.003187"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:15.104281" elapsed="0.003529"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:15.099566" elapsed="0.008388">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:17.112042" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:17.111179" elapsed="0.000935"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:17.112231" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:07:17.112618" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:17.110344" elapsed="0.002331"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:17.113752" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:17.113156" elapsed="0.001403">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:17.115022" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:17.115969" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:17.116423" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:17.116841" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:17.117253" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:17.117695" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:17.118108" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:17.118700" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:17.118305" elapsed="0.000519"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:17.118264" elapsed="0.000614"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:17.119357" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:17.118996" elapsed="0.000516"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:17.118962" elapsed="0.000603"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:17.120090" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:17.119683" elapsed="0.000530"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:17.119648" elapsed="0.000617"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:17.115605" elapsed="0.004710"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:17.115177" elapsed="0.005195"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:17.109291" elapsed="0.011320">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:19.124582" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:19.123813" elapsed="0.000839"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:19.124770" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:07:19.125117" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:19.122989" elapsed="0.002185"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:19.126099" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:19.125556" elapsed="0.001808">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:19.127690" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:19.128251" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:19.128537" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:19.128821" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:19.129080" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:19.129338" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:19.129624" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:19.129977" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:19.129750" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:19.129724" elapsed="0.000438"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:19.130494" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:19.130243" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:19.130220" elapsed="0.000386"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:19.130922" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:19.130680" elapsed="0.000319"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:19.130658" elapsed="0.000374"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:19.128034" elapsed="0.003030"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:19.127792" elapsed="0.003307"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:19.121938" elapsed="0.009293">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:21.135173" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:21.134427" elapsed="0.000816"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:21.135362" elapsed="0.000113"/>
</return>
<msg time="2026-04-11T01:07:21.135751" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:21.133559" elapsed="0.002247"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:21.136728" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:21.136152" elapsed="0.001366">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:21.138009" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:21.138957" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:21.139408" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:21.139903" elapsed="0.000057"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:21.140339" elapsed="0.000078"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:21.140787" elapsed="0.000044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:21.141193" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:21.141828" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:21.141440" elapsed="0.000514"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:21.141359" elapsed="0.000649"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:21.142603" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:21.142249" elapsed="0.000435"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:21.142201" elapsed="0.000516"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:21.143010" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:21.142788" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:21.142767" elapsed="0.000349"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:21.138609" elapsed="0.004538"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:21.138172" elapsed="0.005009"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:21.132516" elapsed="0.010798">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:23.147731" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:23.146794" elapsed="0.001021"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:23.147946" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T01:07:23.148329" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:23.145865" elapsed="0.002557"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:23.149488" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:23.148857" elapsed="0.001977">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:23.151576" elapsed="0.000072"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:23.152559" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:23.153031" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:23.153487" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:23.153902" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:23.154331" elapsed="0.000048"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:23.154790" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:23.155563" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:23.154991" elapsed="0.000690"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:23.154949" elapsed="0.000764"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:23.155937" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:23.155773" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:23.155757" elapsed="0.000258"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:23.156225" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:23.156067" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:23.156052" elapsed="0.000250"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:23.152176" elapsed="0.004149"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:23.151775" elapsed="0.004575"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:23.144682" elapsed="0.011780">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:25.160617" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:25.159790" elapsed="0.000903"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:25.160813" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:07:25.161205" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:25.158881" elapsed="0.002381"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:25.162195" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:25.161649" elapsed="0.001339">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:25.163479" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:25.164439" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:25.164863" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:25.165315" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:25.165663" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:25.165845" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:25.166029" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:25.166295" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:25.166124" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:25.166102" elapsed="0.000281"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:25.166606" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:25.166448" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:25.166432" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:25.167001" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:25.166839" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:25.166824" elapsed="0.000253"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:25.164057" elapsed="0.003043"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:25.163642" elapsed="0.003485"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:25.157798" elapsed="0.009426">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:27.171527" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:27.170745" elapsed="0.000853"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:27.171718" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:07:27.172076" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:27.169912" elapsed="0.002233"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:27.173098" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:27.172537" elapsed="0.004363">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:27.177366" elapsed="0.000081"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:27.178008" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:27.178197" elapsed="0.000019"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:27.178379" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:27.178578" elapsed="0.000019"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:27.178758" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:27.178941" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:27.179200" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:27.179031" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:27.179012" elapsed="0.000266"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:27.179502" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:27.179330" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:27.179315" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:27.179794" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:27.179631" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:27.179616" elapsed="0.000252"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:27.177850" elapsed="0.002041"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:27.177556" elapsed="0.002362"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:27.168805" elapsed="0.011209">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:29.184019" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:29.183245" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:29.184206" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:07:29.184593" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:29.182420" elapsed="0.002233"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:29.185606" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:29.185007" elapsed="0.001347">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:29.186842" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:29.187947" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:29.188374" elapsed="0.000074"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:29.188824" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:29.189285" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:29.189750" elapsed="0.000052"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:29.189978" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:29.190234" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:29.190069" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:29.190050" elapsed="0.000262"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:29.190538" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:29.190364" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:29.190349" elapsed="0.000267"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:29.190826" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:29.190666" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:29.190651" elapsed="0.000251"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:29.187595" elapsed="0.003330"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:29.186998" elapsed="0.003953"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:29.181314" elapsed="0.009734">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:31.195849" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:31.194919" elapsed="0.001007"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:31.196058" elapsed="0.000089"/>
</return>
<msg time="2026-04-11T01:07:31.196551" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:31.193842" elapsed="0.002796"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:31.197849" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:31.197121" elapsed="0.001752">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:31.199435" elapsed="0.000057"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:31.200440" elapsed="0.000055"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:31.200985" elapsed="0.000066"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:31.201507" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:31.201944" elapsed="0.000025"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:31.202144" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:31.202332" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:31.249632" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:31.249302" elapsed="0.000426"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:31.202443" elapsed="0.047316"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:31.249997" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:31.249827" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:31.249811" elapsed="0.000277"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:31.250308" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:31.250143" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:31.250127" elapsed="0.000363"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:31.200034" elapsed="0.050480"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:31.199611" elapsed="0.050934"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:31.192426" elapsed="0.058254">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:33.254693" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:33.253922" elapsed="0.000841"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:33.254881" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:07:33.255289" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:33.253090" elapsed="0.002259"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:33.256160" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:33.255736" elapsed="0.001016">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:33.257098" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:33.257700" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:33.257966" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:33.258221" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:33.258499" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:33.258759" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:33.259020" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:33.259436" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:33.259147" elapsed="0.000386"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:33.259119" elapsed="0.000456"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:33.259992" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:33.259684" elapsed="0.000416"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:33.259657" elapsed="0.000486"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:33.260611" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:33.260239" elapsed="0.000480"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:33.260211" elapsed="0.000553"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:33.257479" elapsed="0.003323"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:33.257203" elapsed="0.003640"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:33.252016" elapsed="0.008968">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:35.265271" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:35.264441" elapsed="0.000902"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:35.265543" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:07:35.265909" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:35.263540" elapsed="0.002425"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:35.266981" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:35.266324" elapsed="0.002184">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:35.269000" elapsed="0.000088"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:35.270012" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:35.270585" elapsed="0.000069"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:35.271261" elapsed="0.000055"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:35.271846" elapsed="0.000073"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:35.272325" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:35.272802" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:35.273154" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:35.272988" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:35.272968" elapsed="0.000265"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:35.273467" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:35.273286" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:35.273270" elapsed="0.000276"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:35.273755" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:35.273597" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:35.273582" elapsed="0.000250"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:35.269649" elapsed="0.004206"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:35.269219" elapsed="0.004665"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:35.262308" elapsed="0.011677">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:37.278203" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:37.277345" elapsed="0.000930"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:37.278428" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T01:07:37.278823" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:37.276499" elapsed="0.002386"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:37.279861" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:37.279251" elapsed="0.001431">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:37.281275" elapsed="0.000061"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:37.282609" elapsed="0.000068"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:37.283192" elapsed="0.000056"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:37.283678" elapsed="0.000060"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:37.284119" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:37.284565" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:37.285002" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:37.285611" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:37.285208" elapsed="0.000544"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:37.285166" elapsed="0.000702"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:37.286362" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:37.285997" elapsed="0.000525"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:37.285960" elapsed="0.000617"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:37.287099" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:37.286713" elapsed="0.000449"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:37.286668" elapsed="0.000518"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:37.282084" elapsed="0.005127"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:37.281502" elapsed="0.005737"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:37.275338" elapsed="0.012099">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:39.291588" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:39.290774" elapsed="0.000883"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:39.291774" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:07:39.292129" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:39.289934" elapsed="0.002252"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:39.293140" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:39.292576" elapsed="0.001752">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:39.294822" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:39.295752" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:39.296179" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:39.296630" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:39.297097" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:39.297551" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:39.297976" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:39.298327" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:39.298152" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:39.298129" elapsed="0.000291"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:39.298635" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:39.298475" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:39.298459" elapsed="0.000261"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:39.298930" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:39.298772" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:39.298756" elapsed="0.000252"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:39.295373" elapsed="0.003658"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:39.294976" elapsed="0.004081"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:39.288809" elapsed="0.010344">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:41.303068" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:41.302296" elapsed="0.000841"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:41.303253" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:07:41.303641" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:41.301489" elapsed="0.002210"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:41.304625" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:41.304052" elapsed="0.001414">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:41.305924" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:41.306565" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:41.306834" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:41.307091" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:41.307469" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:41.307737" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:41.308002" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:41.308365" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:41.308135" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:41.308108" elapsed="0.000391"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:41.308798" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:41.308574" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:41.308552" elapsed="0.000358"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:41.309221" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:41.308984" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:41.308962" elapsed="0.000376"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:41.306317" elapsed="0.003053"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:41.306061" elapsed="0.003365"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:41.300373" elapsed="0.009187">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:43.313825" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:43.313043" elapsed="0.000852"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:43.314068" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T01:07:43.314472" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:43.312073" elapsed="0.002460"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:43.315334" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:43.314921" elapsed="0.001224">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:43.316473" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:43.317039" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:43.317305" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:43.317587" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:43.317848" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:43.318120" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:43.318379" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:43.318755" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:43.318525" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:43.318498" elapsed="0.000367"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:43.319161" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:43.318940" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:43.318918" elapsed="0.000351"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:43.319587" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:43.319342" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:43.319321" elapsed="0.000375"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:43.316821" elapsed="0.002908"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:43.316575" elapsed="0.003190"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:43.311020" elapsed="0.008876">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:45.324343" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:45.323571" elapsed="0.000876"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:45.324574" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T01:07:45.324953" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:45.322678" elapsed="0.002335"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:45.325982" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:45.325372" elapsed="0.001429">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:45.327323" elapsed="0.000111"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:45.328420" elapsed="0.000054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:45.328880" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:45.329305" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:45.329765" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:45.330187" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:45.330635" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:45.331233" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:45.330864" elapsed="0.000574"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:45.330819" elapsed="0.000681"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:45.332008" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:45.331624" elapsed="0.000519"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:45.331587" elapsed="0.000621"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:45.332479" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:45.332292" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:45.332273" elapsed="0.000286"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:45.328019" elapsed="0.004562"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:45.327561" elapsed="0.005046"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:45.321232" elapsed="0.011473">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:47.336760" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:47.335921" elapsed="0.000908"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:47.336951" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:07:47.337330" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:47.335049" elapsed="0.002366"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:47.338312" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:47.337773" elapsed="0.001836">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:47.340075" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:47.341119" elapsed="0.000055"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:47.341651" elapsed="0.000060"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:47.342233" elapsed="0.000039"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:47.342555" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:47.342840" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:47.343200" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:47.343598" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:47.343335" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:47.343307" elapsed="0.000409"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:47.344032" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:47.343794" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:47.343771" elapsed="0.000375"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:47.344480" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:47.344222" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:47.344199" elapsed="0.000400"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:47.340707" elapsed="0.003925"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:47.340232" elapsed="0.004437"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:47.333981" elapsed="0.010830">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:49.349204" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:49.348299" elapsed="0.000979"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:49.349440" elapsed="0.000090"/>
</return>
<msg time="2026-04-11T01:07:49.349841" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:49.347352" elapsed="0.002553"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:49.350878" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:49.350273" elapsed="0.001914">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:49.352791" elapsed="0.000066"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:49.353786" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:49.354223" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:49.354675" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:49.355095" elapsed="0.000098"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:49.355603" elapsed="0.000049"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:49.356032" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:49.356538" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:49.356267" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:49.356216" elapsed="0.000408"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:49.356853" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:49.356688" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:49.356671" elapsed="0.000264"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:49.357183" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:49.356989" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:49.356973" elapsed="0.000304"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:49.353424" elapsed="0.003878"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:49.352980" elapsed="0.004349"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:49.346144" elapsed="0.011332">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:51.361467" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:51.360630" elapsed="0.000914"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:51.361791" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:07:51.362151" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:51.359802" elapsed="0.002405"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:51.362840" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:51.362490" elapsed="0.001145">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:51.363928" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:51.364520" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:51.364788" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:51.365047" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:51.365307" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:51.365595" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:51.365858" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:51.366212" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:51.365983" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:51.365957" elapsed="0.000365"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:51.366641" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:51.366415" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:51.366374" elapsed="0.000376"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:51.367055" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:51.366823" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:51.366802" elapsed="0.000361"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:51.364278" elapsed="0.002916"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:51.364029" elapsed="0.003201"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:51.358754" elapsed="0.008607">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:53.371728" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:53.370746" elapsed="0.001055"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:53.371927" elapsed="0.000151"/>
</return>
<msg time="2026-04-11T01:07:53.372445" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:53.369806" elapsed="0.002681"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:53.373067" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:53.372714" elapsed="0.000894">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:53.373913" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:53.374531" elapsed="0.000039"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:53.374808" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:53.375072" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:53.375347" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:53.375631" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:53.375894" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:53.376430" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:53.376139" elapsed="0.000394"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:53.376106" elapsed="0.000468"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:53.376884" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:53.376653" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:53.376629" elapsed="0.000367"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:53.377314" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:53.377073" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:53.377049" elapsed="0.000403"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:53.374281" elapsed="0.003206"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:53.374014" elapsed="0.003509"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:53.368725" elapsed="0.008934">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:55.381678" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:55.380902" elapsed="0.000848"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:55.381870" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:07:55.382222" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:55.380073" elapsed="0.002206"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:55.383246" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:55.382663" elapsed="0.001463">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:55.384439" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:55.385007" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:55.385269" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:55.385548" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:55.385811" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:55.386071" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:55.386333" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:55.386709" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:55.386478" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:55.386451" elapsed="0.000369"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:55.387136" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:55.386895" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:55.386873" elapsed="0.000373"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:55.387566" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:55.387321" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:55.387299" elapsed="0.000377"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:55.384790" elapsed="0.002918"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:55.384540" elapsed="0.003204"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:55.378955" elapsed="0.008922">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:57.391939" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:57.391153" elapsed="0.000886"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:57.392190" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:07:57.392600" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:57.390312" elapsed="0.002348"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:57.393752" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:57.393157" elapsed="0.001413">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:57.394871" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:57.395475" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:57.395747" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:57.396023" elapsed="0.000033"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:57.396358" elapsed="0.000066"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:57.396678" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:57.396943" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:57.397303" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:57.397074" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:57.397046" elapsed="0.000391"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:57.397742" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:57.397518" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:57.397492" elapsed="0.000362"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:57.398170" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:57.397928" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:57.397906" elapsed="0.000378"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:57.395232" elapsed="0.003086"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:57.394974" elapsed="0.003380"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:57.389222" elapsed="0.009294">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:07:59.402798" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:07:59.401936" elapsed="0.000932"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:07:59.402993" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:07:59.403346" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:07:59.400966" elapsed="0.002465"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:07:59.404334" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:07:59.403788" elapsed="0.001893">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:59.406007" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:59.406609" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:59.406874" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:59.407129" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:59.407380" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:59.407656" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:59.407912" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:59.408261" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:59.408035" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:59.408009" elapsed="0.000469"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:59.408788" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:59.408563" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:59.408541" elapsed="0.000354"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:07:59.409349" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:07:59.409003" elapsed="0.000481"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:07:59.408967" elapsed="0.000558"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:07:59.406366" elapsed="0.003194"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:07:59.406110" elapsed="0.003489"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:07:59.399901" elapsed="0.009834">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:01.414100" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:01.413267" elapsed="0.000925"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:01.414342" elapsed="0.000138"/>
</return>
<msg time="2026-04-11T01:08:01.414793" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:01.412319" elapsed="0.002536"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:01.415811" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:01.415216" elapsed="0.001433">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:01.417117" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:01.418055" elapsed="0.000060"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:01.418613" elapsed="0.000053"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:01.419048" elapsed="0.000058"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:01.419649" elapsed="0.000058"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:01.420091" elapsed="0.000076"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:01.420643" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:01.421228" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:01.420862" elapsed="0.000488"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:01.420818" elapsed="0.000615"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:01.421913" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:01.421557" elapsed="0.000493"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:01.421522" elapsed="0.000601"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:01.422641" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:01.422246" elapsed="0.000519"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:01.422211" elapsed="0.000608"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:01.417704" elapsed="0.005167"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:01.417277" elapsed="0.005651"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:01.411143" elapsed="0.011995">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:03.427459" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:03.426487" elapsed="0.001071"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:03.427687" elapsed="0.000060"/>
</return>
<msg time="2026-04-11T01:08:03.427927" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:03.425608" elapsed="0.002354"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:03.428579" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:03.428183" elapsed="0.001254">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:03.429852" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:03.430495" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:03.430770" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:03.431039" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:03.431367" elapsed="0.000055"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:03.431672" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:03.431940" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:03.432304" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:03.432070" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:03.432042" elapsed="0.000397"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:03.432746" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:03.432516" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:03.432494" elapsed="0.000363"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:03.433156" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:03.432931" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:03.432909" elapsed="0.000356"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:03.430241" elapsed="0.003056"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:03.429958" elapsed="0.003375"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:03.424522" elapsed="0.008967">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:05.437558" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:05.436789" elapsed="0.000840"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:05.437748" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:08:05.438106" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:05.435949" elapsed="0.002214"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:05.440571" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:05.439984" elapsed="0.001332">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:05.441803" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:05.442781" elapsed="0.000034"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:05.443049" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:05.443312" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:05.443593" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:05.443854" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:05.444115" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:05.444501" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:05.444253" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:05.444226" elapsed="0.000384"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:05.444904" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:05.444683" elapsed="0.000385"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:05.444662" elapsed="0.000442"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:05.445424" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:05.445179" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:05.445157" elapsed="0.000376"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:05.442441" elapsed="0.003123"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:05.441962" elapsed="0.003638"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:05.434831" elapsed="0.010904">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:07.449921" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:07.449134" elapsed="0.000834"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:07.450049" elapsed="0.000058"/>
</return>
<msg time="2026-04-11T01:08:07.450282" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:07.448241" elapsed="0.002076"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:07.450905" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:07.450558" elapsed="0.001164">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:07.452018" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:07.452608" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:07.452882" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:07.453141" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:07.453436" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:07.453700" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:07.453960" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:07.454316" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:07.454086" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:07.454059" elapsed="0.000390"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:07.454752" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:07.454524" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:07.454502" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:07.455305" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:07.455082" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:07.455059" elapsed="0.000373"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:07.452365" elapsed="0.003100"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:07.452120" elapsed="0.003381"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:07.447144" elapsed="0.008491">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:09.459703" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:09.458920" elapsed="0.000853"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:09.459891" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:08:09.460271" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:09.458078" elapsed="0.002253"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:09.461262" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:09.460718" elapsed="0.001318">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:09.462520" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:09.463591" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:09.464025" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:09.464535" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:09.464947" elapsed="0.000024"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:09.465147" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:09.465336" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:09.465610" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:09.465444" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:09.465424" elapsed="0.000266"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:09.465904" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:09.465743" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:09.465728" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:09.466198" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:09.466037" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:09.466020" elapsed="0.000257"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:09.463203" elapsed="0.003098"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:09.462678" elapsed="0.003649"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:09.457021" elapsed="0.009417">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:11.470316" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:11.469583" elapsed="0.000828"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:11.470534" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:08:11.470899" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:11.468763" elapsed="0.002198"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:11.471932" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:11.471366" elapsed="0.001409">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:11.473072" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:11.473657" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:11.473921" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:11.474182" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:11.474460" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:11.474721" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:11.474977" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:11.475341" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:11.475101" elapsed="0.000336"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:11.475075" elapsed="0.000396"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:11.475767" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:11.475546" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:11.475524" elapsed="0.000351"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:11.476165" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:11.475945" elapsed="0.000388"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:11.475924" elapsed="0.000443"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:11.473440" elapsed="0.002979"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:11.473171" elapsed="0.003285"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:11.467727" elapsed="0.008862">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:13.480723" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:13.479912" elapsed="0.000885"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:13.480918" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T01:08:13.481276" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:13.478968" elapsed="0.002363"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:13.482339" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:13.481718" elapsed="0.001357">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:13.483421" elapsed="0.000035"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:13.484017" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:13.484281" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:13.484556" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:13.484812" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:13.485084" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:13.485346" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:13.485726" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:13.485497" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:13.485470" elapsed="0.000366"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:13.486127" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:13.485909" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:13.485888" elapsed="0.000360"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:13.486580" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:13.486338" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:13.486315" elapsed="0.000374"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:13.483788" elapsed="0.002933"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:13.483532" elapsed="0.003225"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:13.477901" elapsed="0.008992">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:15.491272" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:15.490429" elapsed="0.000918"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:15.491511" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T01:08:15.491961" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:15.489520" elapsed="0.002537"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:15.493050" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:15.492471" elapsed="0.001846">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:15.494817" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:15.495745" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:15.496170" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:15.496719" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:15.497135" elapsed="0.000043"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:15.497618" elapsed="0.000047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:15.498062" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:15.498657" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:15.498263" elapsed="0.000516"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:15.498222" elapsed="0.000611"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:15.499301" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:15.498951" elapsed="0.000497"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:15.498916" elapsed="0.000593"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:15.500087" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:15.499667" elapsed="0.000552"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:15.499620" elapsed="0.000651"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:15.495374" elapsed="0.004962"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:15.494978" elapsed="0.005455"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:15.488283" elapsed="0.012365">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:17.504850" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:17.504004" elapsed="0.000921"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:17.505064" elapsed="0.000094"/>
</return>
<msg time="2026-04-11T01:08:17.505493" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:17.503109" elapsed="0.002445"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:17.506522" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:17.505931" elapsed="0.001367">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:17.507793" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:17.508755" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:17.509113" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:17.509402" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:17.509676" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:17.509945" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:17.510216" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:17.510615" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:17.510348" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:17.510320" elapsed="0.000410"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:17.511045" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:17.510806" elapsed="0.000319"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:17.510784" elapsed="0.000375"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:17.511491" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:17.511233" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:17.511212" elapsed="0.000394"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:17.508377" elapsed="0.003261"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:17.507949" elapsed="0.003727"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:17.501995" elapsed="0.009912">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:19.515803" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:19.515020" elapsed="0.000852"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:19.515987" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:08:19.516337" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:19.514194" elapsed="0.002228"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:19.517309" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:19.516778" elapsed="0.003933">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:19.521004" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:19.521590" elapsed="0.000034"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:19.521857" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:19.522117" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:19.522374" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:19.522656" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:19.522914" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:19.523272" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:19.523037" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:19.523012" elapsed="0.000402"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:19.523721" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:19.523496" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:19.523473" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:19.524126" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:19.523905" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:19.523883" elapsed="0.000351"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:19.521351" elapsed="0.002915"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:19.521104" elapsed="0.003198"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:19.513169" elapsed="0.011283">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:21.528435" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:21.527668" elapsed="0.000839"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:21.528623" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:08:21.528973" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:21.526836" elapsed="0.002196"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:21.529951" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:21.529408" elapsed="0.001384">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:21.531254" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:21.532002" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:21.532268" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:21.532548" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:21.532899" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:21.533165" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:21.533444" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:21.533799" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:21.533569" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:21.533543" elapsed="0.000366"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:21.534206" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:21.533981" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:21.533960" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:21.534653" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:21.534422" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:21.534368" elapsed="0.000397"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:21.531784" elapsed="0.003013"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:21.531442" elapsed="0.003393"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:21.525771" elapsed="0.009196">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:23.537937" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:23.537226" elapsed="0.000778"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:23.538105" elapsed="0.000067"/>
</return>
<msg time="2026-04-11T01:08:23.538561" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:23.536697" elapsed="0.001953"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:23.539773" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:23.539130" elapsed="0.001643">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:23.541377" elapsed="0.000117"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:23.542553" elapsed="0.000057"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:23.543161" elapsed="0.000057"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:23.543640" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:23.544061" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:23.544504" elapsed="0.000048"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:23.544928" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:23.546141" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:23.545730" elapsed="0.000533"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:23.545091" elapsed="0.001199"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:23.546549" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:23.546348" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:23.546331" elapsed="0.000328"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:23.546942" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:23.546727" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:23.546704" elapsed="0.000347"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:23.542146" elapsed="0.004938"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:23.541641" elapsed="0.005479"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:23.535955" elapsed="0.011288">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:25.552140" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:25.551195" elapsed="0.001018"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:25.552300" elapsed="0.000058"/>
</return>
<msg time="2026-04-11T01:08:25.552589" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:25.550301" elapsed="0.002326"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:25.553209" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:25.552857" elapsed="0.000898">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:25.554059" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:25.554676" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:25.554948" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:25.555213" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:25.555520" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:25.555807" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:25.556075" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:25.556485" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:25.556202" elapsed="0.000365"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:25.556175" elapsed="0.000428"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:25.556919" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:25.556679" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:25.556658" elapsed="0.000391"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:25.557438" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:25.557124" elapsed="0.000424"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:25.557101" elapsed="0.000497"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:25.554451" elapsed="0.003190"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:25.554161" elapsed="0.003533"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:25.548876" elapsed="0.008998">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:27.561931" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:27.561113" elapsed="0.000890"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:27.562126" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T01:08:27.562521" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:27.560288" elapsed="0.002289"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:27.563550" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:27.562926" elapsed="0.001403">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:27.564665" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:27.565239" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:27.565523" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:27.565780" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:27.566030" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:27.566286" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:27.566674" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:27.567035" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:27.566805" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:27.566778" elapsed="0.000367"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:27.567462" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:27.567220" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:27.567199" elapsed="0.000387"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:27.567881" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:27.567659" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:27.567638" elapsed="0.000352"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:27.565022" elapsed="0.002999"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:27.564768" elapsed="0.003290"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:27.559205" elapsed="0.008994">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:29.572898" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:29.572131" elapsed="0.000837"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:29.573089" elapsed="0.000074"/>
</return>
<msg time="2026-04-11T01:08:29.573468" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:29.571302" elapsed="0.002225"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:29.574455" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:29.573885" elapsed="0.001332">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:29.575707" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:29.576633" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:29.577058" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:29.577499" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:29.577915" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:29.578331" elapsed="0.000044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:29.578819" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:29.579437" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:29.579023" elapsed="0.000525"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:29.578982" elapsed="0.000595"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:29.579792" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:29.579629" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:29.579614" elapsed="0.000256"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:29.580083" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:29.579922" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:29.579906" elapsed="0.000255"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:29.576259" elapsed="0.003925"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:29.575862" elapsed="0.004348"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:29.570203" elapsed="0.010104">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:31.584374" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:31.583619" elapsed="0.000858"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:31.584752" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:08:31.585119" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:31.582770" elapsed="0.002406"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:31.586163" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:31.585606" elapsed="0.001173">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:31.587078" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:31.587679" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:31.587947" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:31.588209" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:31.588486" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:31.588747" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:31.589007" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:31.589361" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:31.589132" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:31.589105" elapsed="0.000394"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:31.589829" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:31.589595" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:31.589569" elapsed="0.000371"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:31.590235" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:31.590012" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:31.589991" elapsed="0.000353"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:31.587455" elapsed="0.002922"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:31.587180" elapsed="0.003254"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:31.581666" elapsed="0.008908">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:33.595236" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:33.594482" elapsed="0.000825"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:33.595462" elapsed="0.000088"/>
</return>
<msg time="2026-04-11T01:08:33.595835" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:33.593639" elapsed="0.002253"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:33.596876" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:33.596246" elapsed="0.001354">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:33.597901" elapsed="0.000030"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:33.598503" elapsed="0.000032"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:33.598769" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:33.599027" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:33.599284" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:33.599561" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:33.599820" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:33.600276" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:33.600040" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:33.600012" elapsed="0.000395"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:33.600729" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:33.600485" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:33.600463" elapsed="0.000378"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:33.601149" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:33.600915" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:33.600893" elapsed="0.000368"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:33.598256" elapsed="0.003038"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:33.598000" elapsed="0.003331"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:33.591939" elapsed="0.009551">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:35.605762" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:35.604920" elapsed="0.000911"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:35.605952" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:08:35.606309" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:35.604026" elapsed="0.002339"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:35.607290" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:35.606751" elapsed="0.001371">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:35.608606" elapsed="0.000039"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:35.609191" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:35.609472" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:35.609728" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:35.609980" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:35.610231" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:35.610506" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:35.610856" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:35.610631" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:35.610605" elapsed="0.000362"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:35.611301" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:35.611040" elapsed="0.000356"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:35.611018" elapsed="0.000414"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:35.611746" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:35.611507" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:35.611486" elapsed="0.000367"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:35.608971" elapsed="0.002913"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:35.608715" elapsed="0.003206"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:35.602878" elapsed="0.009177">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:37.617520" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:37.615950" elapsed="0.001665"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:37.617751" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T01:08:37.618219" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:37.614943" elapsed="0.003341"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:37.619625" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:37.618898" elapsed="0.001249">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:37.620468" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:37.621059" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:37.621322" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:37.621600" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:37.621858" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:37.622113" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:37.622372" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:37.622766" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:37.622520" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:37.622493" elapsed="0.000386"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:37.623175" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:37.622952" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:37.622931" elapsed="0.000353"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:37.623600" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:37.623355" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:37.623334" elapsed="0.000376"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:37.620838" elapsed="0.002903"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:37.620576" elapsed="0.003201"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:37.613520" elapsed="0.010391">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:39.627823" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:39.627050" elapsed="0.000843"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:39.628012" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:08:39.628364" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:39.626215" elapsed="0.002236"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:39.629340" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:39.628804" elapsed="0.001364">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:39.630660" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:39.631587" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:39.632094" elapsed="0.000057"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:39.632650" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:39.633074" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:39.633515" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:39.633977" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:39.634566" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:39.634176" elapsed="0.000480"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:39.634135" elapsed="0.000634"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:39.634993" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:39.634829" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:39.634812" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:39.635284" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:39.635125" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:39.635109" elapsed="0.000254"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:39.631213" elapsed="0.004192"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:39.630819" elapsed="0.004614"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:39.625160" elapsed="0.010371">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:41.639572" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:41.638797" elapsed="0.000846"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:41.639760" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:08:41.640114" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:41.637963" elapsed="0.002207"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:41.641625" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:41.640550" elapsed="0.001825">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:41.642867" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:41.643804" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:41.644260" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:41.644768" elapsed="0.000051"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:41.645218" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:41.645678" elapsed="0.000053"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:41.645976" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:41.646235" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:41.646068" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:41.646049" elapsed="0.000265"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:41.646540" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:41.646367" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:41.646351" elapsed="0.000270"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:41.646832" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:41.646672" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:41.646657" elapsed="0.000253"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:41.643456" elapsed="0.003477"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:41.643023" elapsed="0.003936"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:41.636897" elapsed="0.010157">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:43.650981" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:43.650211" elapsed="0.000840"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:43.651169" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T01:08:43.651551" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:43.649414" elapsed="0.002194"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:43.652579" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:43.652007" elapsed="0.001120">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:43.653555" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:43.654137" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:43.654421" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:43.654687" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:43.654948" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:43.655207" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:43.655486" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:43.655858" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:43.655613" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:43.655587" elapsed="0.000383"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:43.656267" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:43.656044" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:43.656022" elapsed="0.000356"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:43.656701" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:43.656473" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:43.656451" elapsed="0.000386"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:43.653917" elapsed="0.002960"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:43.653659" elapsed="0.003261"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:43.648361" elapsed="0.008698">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:45.661012" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:45.660237" elapsed="0.000847"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:45.661206" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:08:45.661596" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:45.659434" elapsed="0.002219"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:45.663038" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:45.662007" elapsed="0.001818">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:45.664286" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:45.665221" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:45.665674" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:45.666094" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:45.666535" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:45.667003" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:45.667447" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:45.667921" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:45.667647" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:45.667606" elapsed="0.000393"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:45.668210" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:45.668051" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:45.668035" elapsed="0.000321"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:45.668589" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:45.668425" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:45.668408" elapsed="0.000259"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:45.664875" elapsed="0.003816"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:45.664477" elapsed="0.004239"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:45.658319" elapsed="0.010492">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:47.672819" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:47.672032" elapsed="0.000856"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:47.673009" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:08:47.673364" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:47.671203" elapsed="0.002249"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:47.674432" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:47.673853" elapsed="0.001213">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:47.675361" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:47.675948" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:47.676212" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:47.676489" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:47.676753" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:47.677009" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:47.677269" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:47.677640" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:47.677410" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:47.677365" elapsed="0.000385"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:47.678070" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:47.677838" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:47.677816" elapsed="0.000363"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:47.678498" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:47.678251" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:47.678229" elapsed="0.000379"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:47.675732" elapsed="0.002909"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:47.675485" elapsed="0.003191"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:47.670148" elapsed="0.008659">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:49.682938" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:49.682108" elapsed="0.000905"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:49.683134" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:08:49.683541" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:49.681188" elapsed="0.002415"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:49.684582" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:49.683978" elapsed="0.001929">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:49.686205" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:49.686873" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:49.687142" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:49.687423" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:49.687686" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:49.687945" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:49.688208" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:49.688586" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:49.688333" elapsed="0.000332"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:49.688307" elapsed="0.000392"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:49.689010" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:49.688773" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:49.688752" elapsed="0.000368"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:49.689439" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:49.689194" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:49.689172" elapsed="0.000380"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:49.686650" elapsed="0.002936"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:49.686304" elapsed="0.003319"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:49.680068" elapsed="0.009687">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:51.692927" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:51.692416" elapsed="0.000560"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:51.693058" elapsed="0.000057"/>
</return>
<msg time="2026-04-11T01:08:51.693302" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:51.691801" elapsed="0.001537"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:51.693962" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:51.693594" elapsed="0.000925">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:51.694833" elapsed="0.000033"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:51.695455" elapsed="0.000034"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:51.695744" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:51.696058" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:51.696336" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:51.696635" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:51.696914" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:51.697181" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:51.697017" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:51.696997" elapsed="0.000265"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:51.697490" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:51.697315" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:51.697299" elapsed="0.000270"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:51.697782" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:51.697621" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:51.697606" elapsed="0.000336"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:51.695202" elapsed="0.002769"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:51.694939" elapsed="0.003064"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:51.691011" elapsed="0.007100">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:53.702056" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:53.701279" elapsed="0.000848"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:53.702245" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:08:53.702632" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:53.700491" elapsed="0.002198"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:53.703667" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:53.703091" elapsed="0.001812">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:53.705373" elapsed="0.000081"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:53.706308" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:53.706767" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:53.707226" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:53.707535" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:53.707796" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:53.708055" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:53.708460" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:53.708179" elapsed="0.000387"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:53.708152" elapsed="0.000459"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:53.708926" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:53.708698" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:53.708675" elapsed="0.000377"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:53.709405" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:53.709144" elapsed="0.000342"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:53.709116" elapsed="0.000402"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:53.705960" elapsed="0.003590"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:53.705565" elapsed="0.004021"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:53.699427" elapsed="0.010295">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:55.713698" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:55.712934" elapsed="0.000835"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:55.713941" elapsed="0.000088"/>
</return>
<msg time="2026-04-11T01:08:55.714313" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:55.712112" elapsed="0.002257"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:55.715295" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:55.714757" elapsed="0.001312">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:55.716558" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:55.717481" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:55.717943" elapsed="0.000047"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:55.718533" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:55.718959" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:55.719503" elapsed="0.000049"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:55.719933" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:55.720529" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:55.720134" elapsed="0.000517"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:55.720093" elapsed="0.000612"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:55.721180" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:55.720824" elapsed="0.000476"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:55.720788" elapsed="0.000563"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:55.721857" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:55.721499" elapsed="0.000496"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:55.721464" elapsed="0.000584"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:55.717105" elapsed="0.004995"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:55.716716" elapsed="0.005444"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:55.711045" elapsed="0.011323">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:57.726532" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:57.725742" elapsed="0.000861"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:57.726717" elapsed="0.000343"/>
</return>
<msg time="2026-04-11T01:08:57.727362" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:57.724838" elapsed="0.002624"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:57.728373" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:57.727823" elapsed="0.001861">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:57.730152" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:57.731086" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:57.731544" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:57.731963" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:57.732380" elapsed="0.000074"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:57.732828" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:57.733301" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:57.733901" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:57.733533" elapsed="0.000488"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:57.733491" elapsed="0.000586"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:57.734426" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:57.734212" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:57.734173" elapsed="0.000332"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:57.734714" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:57.734556" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:57.734541" elapsed="0.000249"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:57.730733" elapsed="0.004079"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:57.730310" elapsed="0.004528"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:57.723755" elapsed="0.011255">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:08:59.739066" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:08:59.738228" elapsed="0.000906"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:08:59.739270" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:08:59.739660" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:08:59.737410" elapsed="0.002307"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:08:59.740665" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:08:59.740075" elapsed="0.001378">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:59.741914" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:59.742874" elapsed="0.000049"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:59.743295" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:59.743745" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:59.744159" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:59.744599" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:59.745014" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:59.745605" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:59.745210" elapsed="0.000518"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:59.745170" elapsed="0.000612"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:59.746263" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:59.745901" elapsed="0.000551"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:59.745866" elapsed="0.000643"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:08:59.746987" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:08:59.746626" elapsed="0.000483"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:08:59.746592" elapsed="0.000570"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:08:59.742517" elapsed="0.004677"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:08:59.742070" elapsed="0.005150"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:08:59.736321" elapsed="0.010994">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:01.751225" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:01.750488" elapsed="0.000808"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:01.751443" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:09:01.751798" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:01.749671" elapsed="0.002186"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:01.752805" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:01.752205" elapsed="0.001842">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:01.754540" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:01.755474" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:01.755902" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:01.756356" elapsed="0.000078"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:01.756916" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:01.757294" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:01.757575" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:01.757932" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:01.757702" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:01.757675" elapsed="0.000368"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:01.758339" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:01.758117" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:01.758096" elapsed="0.000374"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:01.758765" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:01.758543" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:01.758522" elapsed="0.000353"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:09:01.755097" elapsed="0.003809"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:09:01.754702" elapsed="0.004242"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:09:01.748630" elapsed="0.010445">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:03.762947" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:03.762130" elapsed="0.000886"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:03.763136" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:09:03.763520" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:03.761313" elapsed="0.002263"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:03.764528" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:03.763923" elapsed="0.001369">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:03.765794" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:03.766744" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:03.767167" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:03.767610" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:03.768025" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:03.768467" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:03.768881" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:03.769466" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:03.769076" elapsed="0.000514"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:03.769035" elapsed="0.000608"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:03.770117" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:03.769760" elapsed="0.000475"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:03.769726" elapsed="0.000580"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:03.770812" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:03.770456" elapsed="0.000476"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:03.770418" elapsed="0.000567"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:09:03.766365" elapsed="0.004670"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:09:03.765954" elapsed="0.005136"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:09:03.760288" elapsed="0.011006">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:05.776201" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:05.775295" elapsed="0.000981"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:05.776403" elapsed="0.000068"/>
</return>
<msg time="2026-04-11T01:09:05.776648" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:05.774410" elapsed="0.002274"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:05.777252" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:05.776905" elapsed="0.001201">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:05.778424" elapsed="0.000032"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:05.779005" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:05.779271" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:05.779561" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:05.779822" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:05.780078" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:05.780334" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:05.780712" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:05.780482" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:05.780453" elapsed="0.000370"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:05.781117" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:05.780897" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:05.780876" elapsed="0.000348"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:05.781537" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:05.781296" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:05.781275" elapsed="0.000369"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:09:05.778785" elapsed="0.002891"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:09:05.778538" elapsed="0.003176"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:09:05.773027" elapsed="0.008822">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:07.785835" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:07.785070" elapsed="0.000835"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:07.786023" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:09:07.786375" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:07.784250" elapsed="0.002212"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:07.787427" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:07.786816" elapsed="0.001120">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:07.788225" elapsed="0.000030"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:07.788808" elapsed="0.000030"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:07.789068" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:07.789319" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:07.789591" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:07.789843" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:07.790187" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:07.790557" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:07.790312" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:07.790286" elapsed="0.000382"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:07.790976" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:07.790742" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:07.790721" elapsed="0.000365"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:07.791377" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:07.791160" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:07.791139" elapsed="0.000368"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:09:07.788595" elapsed="0.002945"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:09:07.788324" elapsed="0.003251"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:09:07.783196" elapsed="0.008510">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:09.795596" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:09.794834" elapsed="0.000832"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:09.795784" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:09:09.796202" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:09.794004" elapsed="0.002257"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:09.796905" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:09.796561" elapsed="0.002966">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:09.799825" elapsed="0.000031"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:09.800432" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:09.800701" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:09.800959" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:09.801219" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:09.801494" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:09.801758" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:09.802114" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:09.801885" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:09.801858" elapsed="0.000365"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:09.802542" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:09.802297" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:09.802275" elapsed="0.000376"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:09.802947" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:09.802723" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:09.802702" elapsed="0.000353"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:09:09.800195" elapsed="0.002893"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:09:09.799925" elapsed="0.003199"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:09:09.792961" elapsed="0.010295">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:11.807537" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:11.806775" elapsed="0.000830"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:11.807842" elapsed="0.000092"/>
</return>
<msg time="2026-04-11T01:09:11.808213" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:11.805932" elapsed="0.002337"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:11.809405" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:11.808650" elapsed="0.001509">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:11.810656" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:11.811573" elapsed="0.000048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:11.812000" elapsed="0.000043"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:11.812436" elapsed="0.000046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:11.812849" elapsed="0.000044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:11.813360" elapsed="0.000083"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:11.813828" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:11.814410" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:11.814023" elapsed="0.000510"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:11.813984" elapsed="0.000603"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:11.815106" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:11.814751" elapsed="0.000475"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:11.814712" elapsed="0.000566"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:11.815616" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:11.815419" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:11.815358" elapsed="0.000338"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:09:11.811199" elapsed="0.004519"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:09:11.810815" elapsed="0.004929"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:09:11.804848" elapsed="0.010993">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:13.819760" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:13.818994" elapsed="0.000836"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:13.819945" elapsed="0.000074"/>
</return>
<msg time="2026-04-11T01:09:13.820301" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:13.818127" elapsed="0.002233"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:13.821283" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:13.820745" elapsed="0.001313">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:13.822577" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:13.823510" elapsed="0.000050"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:13.823933" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:13.824349" elapsed="0.000074"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:13.824796" elapsed="0.000045"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:13.825211" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:13.825656" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:13.826803" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:13.826518" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:13.825938" elapsed="0.000948"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:13.827107" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:13.826940" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:13.826925" elapsed="0.000261"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:13.827414" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:13.827238" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:13.827222" elapsed="0.000273"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:09:13.823134" elapsed="0.004385"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:09:13.822738" elapsed="0.004807"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:09:13.817096" elapsed="0.010545">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Linear Topology On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:15.831777" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:15.830953" elapsed="0.000899"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:15.831978" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:09:15.832352" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:15.830036" elapsed="0.002409"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:15.833472" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:15.832847" elapsed="0.001417">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.834842" elapsed="0.000056"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"node-id":"openflow:${switch}"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.835768" elapsed="0.000031"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.836034" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.836294" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.836569" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:2"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.836828" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${edge}</var>
<arg>${switch}==1 or ${switch}==${switches}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.837088" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"tp-id":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.837464" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:15.837215" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:15.837187" elapsed="0.000390"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"source-tp":"openflow:${switch}:3"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.837875" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:15.837651" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:15.837630" elapsed="0.000351"/>
</if>
<if>
<branch type="IF" condition="not ${edge}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>"dest-tp":"openflow:${switch}:3</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.838274" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:15.838054" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:15.838033" elapsed="0.000365"/>
</if>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:09:15.835523" elapsed="0.002910"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:09:15.835014" elapsed="0.003454"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check Linear topology.</doc>
<status status="FAIL" start="2026-04-11T01:09:15.828942" elapsed="0.009659">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T01:09:15.838781" level="FAIL">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 5 minutes. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>300s</arg>
<arg>2s</arg>
<arg>ClusterOpenFlow.Check Linear Topology On Member</arg>
<arg>${SWITCHES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:04:14.091592" elapsed="301.747321">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 5 minutes. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Linear Topology</doc>
<status status="FAIL" start="2026-04-11T01:04:14.079531" elapsed="301.759602">Keyword 'ClusterOpenFlow.Check Linear Topology On Member' failed after retrying for 5 minutes. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t67" name="Check Stats Are Not Frozen After Cluster Restart" line="449">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:09:15.844112" elapsed="0.000321"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:09:15.843738" elapsed="0.000774"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:09:15.845926" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:09:15.845762" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-11T01:09:15.845735" elapsed="0.000287"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:09:15.851696" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:09:15.851588" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T01:09:15.851569" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:09:15.852770" 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-11T01:09:15.852373" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:09:15.853244" 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-11T01:09:15.852959" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:09:15.853314" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:09:15.853482" 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-11T01:09:15.851996" elapsed="0.001511"/>
</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-11T01:09:15.853859" 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-11T01:09:15.854101" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:15.853954" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:15.853938" elapsed="0.000238"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:09:15.853716" elapsed="0.000483"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:09:15.853561" elapsed="0.000662"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:09:15.851198" elapsed="0.003078"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:09:15.845338" elapsed="0.008992"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:09:15.844734" elapsed="0.009640"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:09:15.840521" elapsed="0.013923"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:15.856443" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:15.856132" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:15.856517" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:09:15.856664" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:15.855793" elapsed="0.000896"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:15.857112" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:15.856841" elapsed="0.000607">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.857653" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.857886" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.858064" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.858232" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.858414" elapsed="0.000021"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:15.858535" elapsed="0.000017"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:15.855452" elapsed="0.003188">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.858826" elapsed="0.000023"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.858999" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.859178" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.859351" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:15.859564" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:15.855112" elapsed="0.004559">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:16.863780" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:16.863006" elapsed="0.000845"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:16.863972" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:09:16.864327" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:16.862160" elapsed="0.002258"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:16.866077" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:16.864784" elapsed="0.002088">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:16.867344" elapsed="0.000081"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:16.867903" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:16.868294" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:16.868756" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:16.869243" elapsed="0.000082"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:16.869482" elapsed="0.000049"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:16.861310" elapsed="0.008400">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:16.869880" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:16.870048" elapsed="0.000019"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:16.870227" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:16.870413" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:16.870610" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:16.860350" elapsed="0.010368">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:17.874771" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:17.874008" elapsed="0.000831"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:17.874955" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T01:09:17.875301" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:17.873175" elapsed="0.002182"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:17.876368" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:17.875735" elapsed="0.001400">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:17.877620" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:17.878257" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:17.878680" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:17.879062" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:17.879465" elapsed="0.000045"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:17.879612" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:17.872343" elapsed="0.007521">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:17.880231" elapsed="0.000045"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:17.880633" elapsed="0.000044"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:17.881027" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:17.881429" elapsed="0.000048"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:17.881860" elapsed="0.000073"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:17.871367" elapsed="0.010758">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:18.886818" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:18.885955" elapsed="0.000960"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:18.887068" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T01:09:18.887487" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:18.884999" elapsed="0.002548"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:18.888703" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:18.887917" elapsed="0.002121">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:18.890673" elapsed="0.000065"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:18.891231" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:18.891667" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:18.892052" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:18.892457" elapsed="0.000047"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:18.892607" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:18.884019" elapsed="0.008822">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:18.893201" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:18.893605" elapsed="0.000048"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:18.894011" elapsed="0.000051"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:18.894615" elapsed="0.000061"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:18.894937" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:18.882955" elapsed="0.012136">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:19.900635" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:19.898855" elapsed="0.001853"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:19.900964" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:09:19.901760" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:19.897923" elapsed="0.003932"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:19.903073" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:19.902306" elapsed="0.001563">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:19.904334" elapsed="0.000080"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:19.904890" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:19.905334" elapsed="0.000076"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:19.905781" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:19.905984" elapsed="0.000022"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:19.906051" elapsed="0.000016"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:19.896876" elapsed="0.009284">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:19.906325" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:19.906510" elapsed="0.000021"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:19.906693" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:19.906868" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:19.907065" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:19.895882" elapsed="0.011292">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:20.911351" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:20.910564" elapsed="0.000900"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:20.911583" elapsed="0.000075"/>
</return>
<msg time="2026-04-11T01:09:20.911927" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:20.909590" elapsed="0.002393"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:20.913214" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:20.912376" elapsed="0.001629">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:20.914490" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:20.915488" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:20.915897" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:20.916333" elapsed="0.000072"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:20.916745" elapsed="0.000033"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:20.916846" elapsed="0.000024"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:20.908743" elapsed="0.008261">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:20.917245" elapsed="0.000031"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:20.917511" elapsed="0.000031"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:20.917781" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:20.918134" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:20.918445" elapsed="0.000032"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:20.907832" elapsed="0.010775">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:21.922835" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:21.922051" elapsed="0.000853"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:21.923025" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:09:21.923438" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:21.921206" elapsed="0.002291"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:21.924503" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:21.923848" elapsed="0.001409">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:21.925747" elapsed="0.000052"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:21.926264" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:21.926692" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:21.927142" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:21.927556" elapsed="0.000048"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:21.927706" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:21.920296" elapsed="0.007645">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:21.928308" elapsed="0.000052"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:21.928719" elapsed="0.000047"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:21.929121" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:21.929605" elapsed="0.000052"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:21.930059" elapsed="0.000045"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:21.919373" elapsed="0.010931">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:22.934754" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:22.933906" elapsed="0.000922"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:22.934953" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:09:22.935330" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:22.933008" elapsed="0.002411"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:22.936499" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:22.935804" elapsed="0.001487">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:22.937805" elapsed="0.000052"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:22.938368" elapsed="0.000084"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:22.938816" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:22.939217" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:22.939787" elapsed="0.000052"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:22.939951" elapsed="0.000040"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:22.932100" elapsed="0.008108">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:22.940633" elapsed="0.000569"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:22.941610" elapsed="0.000052"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:22.942065" elapsed="0.000052"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:22.942567" elapsed="0.000052"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:22.942973" elapsed="0.000024"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:22.931054" elapsed="0.012034">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:23.947247" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:23.946497" elapsed="0.000821"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:23.947476" elapsed="0.000090"/>
</return>
<msg time="2026-04-11T01:09:23.947853" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:23.945655" elapsed="0.002254"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:23.948917" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:23.948260" elapsed="0.001456">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:23.950177" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:23.950726" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:23.951124" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:23.951536" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:23.951921" elapsed="0.000045"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:23.952066" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:23.944743" elapsed="0.007552">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:23.952691" elapsed="0.000049"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:23.953068" elapsed="0.000044"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:23.953593" elapsed="0.000081"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:23.953917" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:23.954115" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:23.943833" elapsed="0.010392">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:24.958364" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:24.957624" elapsed="0.000847"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:24.958603" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:09:24.958957" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:24.956794" elapsed="0.002219"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:24.960010" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:24.959360" elapsed="0.001462">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:24.961436" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:24.961966" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:24.962361" elapsed="0.000076"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:24.962781" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:24.963162" elapsed="0.000044"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:24.963308" elapsed="0.000035"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:24.955934" elapsed="0.007636">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:24.963938" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:24.964313" elapsed="0.000045"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:24.964791" elapsed="0.000370"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:24.965322" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:24.965536" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:24.954997" elapsed="0.010648">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:25.969731" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:25.968977" elapsed="0.000823"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:25.969914" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:09:25.970260" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:25.968141" elapsed="0.002176"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:25.971312" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:25.970697" elapsed="0.001388">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:25.972567" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:25.973079" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:25.973499" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:25.973891" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:25.974275" elapsed="0.000043"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:25.974445" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:25.967244" elapsed="0.007430">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:25.975033" elapsed="0.000045"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:25.975428" elapsed="0.000046"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:25.975842" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:25.976222" elapsed="0.000044"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:25.976686" elapsed="0.000046"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:25.966293" elapsed="0.010633">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:26.981172" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:26.980426" elapsed="0.000815"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:26.981357" elapsed="0.000108"/>
</return>
<msg time="2026-04-11T01:09:26.981744" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:26.979449" elapsed="0.002352"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:26.982806" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:26.982151" elapsed="0.001456">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:26.984067" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:26.984618" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:26.985037" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:26.985443" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:26.985826" elapsed="0.000050"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:26.985993" elapsed="0.000041"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:26.978592" elapsed="0.007644">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:26.986635" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:26.987055" elapsed="0.000047"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:26.987490" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:26.987873" elapsed="0.000037"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:26.988153" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:26.977704" elapsed="0.010597">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:27.992899" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:27.992132" elapsed="0.000835"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:27.993081" elapsed="0.000074"/>
</return>
<msg time="2026-04-11T01:09:27.993455" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:27.991312" elapsed="0.002201"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:27.994561" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:27.993863" elapsed="0.001315">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:27.995505" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:27.995848" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:27.996106" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:27.996357" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:27.996629" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:27.996724" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:27.990518" elapsed="0.006358">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:27.997118" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:27.997362" elapsed="0.000048"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:27.997731" elapsed="0.000033"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:27.997990" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:27.998303" elapsed="0.000031"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:27.989590" elapsed="0.008895">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:29.002990" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:29.002086" elapsed="0.000976"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:29.003184" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:09:29.003578" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:29.000954" elapsed="0.002681"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:29.004646" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:29.003987" elapsed="0.001555">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:29.006037" elapsed="0.000053"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:29.006662" elapsed="0.000059"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:29.007096" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:29.007545" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:29.007957" elapsed="0.000047"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:29.008111" elapsed="0.000038"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:29.000099" elapsed="0.008263">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:29.008820" elapsed="0.000052"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:29.009232" elapsed="0.000050"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:29.009829" elapsed="0.000060"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:29.010172" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:29.010373" elapsed="0.000037"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:28.999152" elapsed="0.011349">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:30.015354" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:30.014610" elapsed="0.000846"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:30.015576" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:09:30.015934" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:30.013764" elapsed="0.002227"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:30.017007" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:30.016347" elapsed="0.001468">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:30.018274" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:30.018822" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:30.019214" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:30.019627" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:30.020178" elapsed="0.000064"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:30.020355" elapsed="0.000074"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:30.012819" elapsed="0.007816">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:30.021005" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:30.021377" elapsed="0.000076"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:30.021891" elapsed="0.000052"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:30.022256" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:30.022478" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:30.011249" elapsed="0.011340">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:31.026841" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:31.026046" elapsed="0.000865"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:31.027029" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:09:31.027381" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:31.025196" elapsed="0.002277"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:31.028475" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:31.027820" elapsed="0.001453">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:31.029768" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:31.030286" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:31.030712" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:31.031089" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:31.031502" elapsed="0.000046"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:31.031647" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:31.024271" elapsed="0.007608">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:31.032242" elapsed="0.000045"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:31.032647" elapsed="0.000076"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:31.033102" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:31.033517" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:31.033951" elapsed="0.000045"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:31.023334" elapsed="0.010855">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:32.039139" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:32.038225" elapsed="0.000989"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:32.039344" elapsed="0.000119"/>
</return>
<msg time="2026-04-11T01:09:32.039754" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:32.037415" elapsed="0.002397"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:32.040894" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:32.040179" elapsed="0.001614">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:32.042252" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:32.042855" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:32.043128" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:32.043298" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:32.043483" elapsed="0.000021"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:32.043550" elapsed="0.000016"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:32.036000" elapsed="0.007657">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:32.043822" elapsed="0.000020"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:32.043987" elapsed="0.000021"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:32.044166" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:32.044346" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:32.044560" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:32.035042" elapsed="0.009627">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:33.048694" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:33.047918" elapsed="0.000849"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:33.048883" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:09:33.049233" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:33.047053" elapsed="0.002236"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:33.050294" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:33.049671" elapsed="0.001402">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:33.051767" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:33.052202" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:33.052469" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:33.052708" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:33.052944" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:33.053035" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:33.046216" elapsed="0.006965">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:33.053437" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:33.053672" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:33.053919" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:33.054158" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:33.054454" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:33.045305" elapsed="0.009298">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:34.059321" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:34.058547" elapsed="0.000873"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:34.059539" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:09:34.059894" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:34.057203" elapsed="0.002748"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:34.060958" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:34.060303" elapsed="0.001442">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:34.062207" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:34.062757" elapsed="0.000104"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:34.063197" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:34.063372" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:34.063559" elapsed="0.000021"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:34.063624" elapsed="0.000016"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:34.056357" elapsed="0.007375">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:34.063896" elapsed="0.000021"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:34.064064" elapsed="0.000020"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:34.064241" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:34.064430" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:34.064627" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:34.055486" elapsed="0.009247">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:35.069186" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:35.068336" elapsed="0.000926"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:35.069418" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:09:35.069849" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:35.067479" elapsed="0.002428"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:35.070961" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:35.070265" elapsed="0.001536">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:35.072275" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:35.072864" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:35.073272" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:35.073766" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:35.074165" elapsed="0.000046"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:35.074313" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:35.066607" elapsed="0.007976">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:35.074987" elapsed="0.000050"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:35.075541" elapsed="0.000051"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:35.075991" elapsed="0.000051"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:35.076430" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:35.076899" elapsed="0.000048"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:35.065569" elapsed="0.011579">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:36.085358" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:36.081343" elapsed="0.004125"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:36.085597" elapsed="0.000096"/>
</return>
<msg time="2026-04-11T01:09:36.086047" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:36.080285" elapsed="0.005826"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:36.087233" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:36.086558" elapsed="0.001538">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:36.088612" elapsed="0.000053"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:36.089173" elapsed="0.000068"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:36.089643" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:36.090055" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:36.090479" elapsed="0.000048"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:36.090631" elapsed="0.000037"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:36.079076" elapsed="0.011812">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:36.091285" elapsed="0.000051"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:36.091879" elapsed="0.000081"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:36.092297" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:36.092496" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:36.092696" elapsed="0.000020"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:36.077994" elapsed="0.014812">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:37.097146" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:37.096143" elapsed="0.001067"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:37.097296" elapsed="0.000062"/>
</return>
<msg time="2026-04-11T01:09:37.097569" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:37.095282" elapsed="0.002325"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:37.098267" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:37.097842" elapsed="0.001000">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:37.099157" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:37.099531" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:37.099793" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:37.100147" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:37.100433" elapsed="0.000032"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:37.100532" elapsed="0.000024"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:37.094486" elapsed="0.006205">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:37.100948" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:37.101196" elapsed="0.000029"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:37.101482" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:37.101738" elapsed="0.000031"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:37.102039" elapsed="0.000039"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:37.093559" elapsed="0.008668">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:38.106535" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:38.105736" elapsed="0.000871"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:38.106726" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:09:38.107084" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:38.104851" elapsed="0.002291"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:38.108164" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:38.107529" elapsed="0.001985">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:38.109987" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:38.110545" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:38.110949" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:38.111338" elapsed="0.000074"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:38.111756" elapsed="0.000046"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:38.111905" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:38.103950" elapsed="0.008190">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:38.112542" elapsed="0.000049"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:38.112924" elapsed="0.000045"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:38.113329" elapsed="0.000050"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:38.113775" elapsed="0.000140"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:38.114328" elapsed="0.000022"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:38.102946" elapsed="0.011514">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:39.120344" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:39.119542" elapsed="0.000901"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:39.120574" elapsed="0.000090"/>
</return>
<msg time="2026-04-11T01:09:39.120945" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:39.118548" elapsed="0.002452"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:39.122268" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:39.121556" elapsed="0.001286">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:39.123140" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:39.123503" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:39.123756" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:39.123997" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:39.124236" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:39.124328" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:39.116198" elapsed="0.008305">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:39.124738" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:39.124972" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:39.125232" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:39.125496" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:39.125788" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:39.115185" elapsed="0.010757">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:40.130083" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:40.129222" elapsed="0.000932"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:40.130281" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:09:40.130562" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:40.128409" elapsed="0.002187"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:40.131218" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:40.130816" elapsed="0.000927">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:40.132046" elapsed="0.000030"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:40.132372" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:40.132643" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:40.132882" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:40.133119" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:40.133209" elapsed="0.000025"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:40.127564" elapsed="0.005815">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:40.133628" elapsed="0.000029"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:40.133861" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:40.134481" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:40.134733" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:40.135008" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:40.126653" elapsed="0.008600">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:41.139446" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:41.138675" elapsed="0.000841"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:41.139632" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:09:41.139986" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:41.137828" elapsed="0.002216"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:41.141073" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:41.140424" elapsed="0.001432">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:41.142319" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:41.142874" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:41.143272" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:41.143685" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:41.144066" elapsed="0.000044"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:41.144212" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:41.136970" elapsed="0.007502">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:41.144891" elapsed="0.000049"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:41.145267" elapsed="0.000023"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:41.145465" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:41.145639" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:41.145835" elapsed="0.000021"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:41.135970" elapsed="0.009974">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:42.150013" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:42.149252" elapsed="0.000831"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:42.150199" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:09:42.150582" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:42.148447" elapsed="0.002192"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:42.151685" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:42.150989" elapsed="0.001509">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:42.152797" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:42.153121" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:42.153367" elapsed="0.000059"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:42.153648" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:42.153882" elapsed="0.000027"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:42.153971" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:42.147569" elapsed="0.006549">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:42.154604" elapsed="0.000035"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:42.154852" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:42.155144" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:42.155410" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:42.155708" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:42.146665" elapsed="0.009196">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:43.160512" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:43.159743" elapsed="0.000842"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:43.160698" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:09:43.161053" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:43.158914" elapsed="0.002196"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:43.162116" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:43.161493" elapsed="0.001441">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:43.163366" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:43.163712" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:43.163960" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:43.164201" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:43.164459" elapsed="0.000029"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:43.164554" elapsed="0.000023"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:43.158038" elapsed="0.006665">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:43.164934" elapsed="0.000028"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:43.165167" elapsed="0.000027"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:43.165476" elapsed="0.000038"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:43.165735" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:43.166006" elapsed="0.000029"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:43.156576" elapsed="0.009583">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:44.170057" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:44.169291" elapsed="0.000832"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:44.170233" elapsed="0.000074"/>
</return>
<msg time="2026-04-11T01:09:44.170615" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:44.168475" elapsed="0.002197"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:44.171671" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:44.171025" elapsed="0.001395">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:44.172922" elapsed="0.000051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:44.173435" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:44.173684" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:44.174026" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:44.174266" elapsed="0.000028"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:44.174358" elapsed="0.000041"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:44.167652" elapsed="0.006876">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:44.174763" elapsed="0.000031"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:44.175002" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:44.175254" elapsed="0.000029"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:44.175518" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:44.175795" elapsed="0.000028"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:44.166800" elapsed="0.009144">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:45.180859" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:45.180057" elapsed="0.000875"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:45.181086" elapsed="0.000099"/>
</return>
<msg time="2026-04-11T01:09:45.181527" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:45.179198" elapsed="0.002386"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:45.182688" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:45.181955" elapsed="0.001600">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:45.183865" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:45.184191" elapsed="0.000032"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:45.184460" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:45.184699" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:45.184935" elapsed="0.000027"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:45.185023" elapsed="0.000022"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:45.177687" elapsed="0.007485">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:45.185423" elapsed="0.000030"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:45.185658" elapsed="0.000028"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:45.185905" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:45.186143" elapsed="0.000027"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:45.186432" elapsed="0.000030"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:45.176710" elapsed="0.009872">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Flow Stats Are Not Frozen">
<kw name="Extract Flow Duration">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:46.190772" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:46.190002" elapsed="0.000839"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:46.190957" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:09:46.191313" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:46.189135" elapsed="0.002235"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:46.192595" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_NODES_API}/node=openflow%3A1/flow-node-inventory:table=0/flow=1?content=nonconfig</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:46.191919" elapsed="0.001444">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.193859" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${json_resp}</var>
<arg>${resp.content}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.194482" elapsed="0.000060"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_list}</var>
<arg>${json_resp}</arg>
<arg>flow-node-inventory:flow</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.194930" elapsed="0.000065"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${flow_stats}</var>
<arg>${flow_list}[0]</arg>
<arg>opendaylight-flow-statistics:flow-statistics</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.195356" elapsed="0.000080"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${duration}</var>
<arg>${flow_stats}[duration]</arg>
<arg>second</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.195781" elapsed="0.000044"/>
</kw>
<return>
<value>${duration}</value>
<status status="NOT RUN" start="2026-04-11T01:09:46.195926" elapsed="0.000036"/>
</return>
<var>${duration_1}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:46.188242" elapsed="0.007919">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_1}</var>
<arg>${duration_1}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.196560" elapsed="0.000047"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>${period_in_seconds}</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.196962" elapsed="0.000046"/>
</kw>
<kw name="Extract Flow Duration">
<var>${duration_2}</var>
<arg>${member_index}</arg>
<doc>Extract duration for flow 1 in switch 1.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.197366" elapsed="0.000081"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${duration_2}</var>
<arg>${duration_2}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.197790" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Equal As Integers" owner="BuiltIn">
<arg>${duration_1}</arg>
<arg>${duration_2}</arg>
<doc>Fails if objects are equal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.198223" elapsed="0.000044"/>
</kw>
<doc>Verify flow stats are not frozen for flow 1 and switch 1.</doc>
<status status="FAIL" start="2026-04-11T01:09:46.187326" elapsed="0.011191">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T01:09:46.198702" level="FAIL">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>Check Flow Stats Are Not Frozen</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:09:15.854633" elapsed="30.344270">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check that duration flow stat is increasing.</doc>
<status status="FAIL" start="2026-04-11T01:09:15.839769" elapsed="30.359459">Keyword 'Check Flow Stats Are Not Frozen' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t68" name="Check Flows In Operational DS After Controller Restarts" line="453">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:09:46.205039" elapsed="0.000301"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:09:46.204553" elapsed="0.000880"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:09:46.206467" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:09:46.206326" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-11T01:09:46.206303" elapsed="0.000235"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:09:46.211317" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:09:46.211187" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-11T01:09:46.211167" elapsed="0.000253"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:09:46.212489" 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-11T01:09:46.212091" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:09:46.213001" 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-11T01:09:46.212678" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:09:46.213071" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:09:46.213224" 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-11T01:09:46.211714" elapsed="0.001535"/>
</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-11T01:09:46.213630" 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-11T01:09:46.213915" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:09:46.213766" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:09:46.213748" elapsed="0.000245"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:09:46.213483" elapsed="0.000535"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:09:46.213304" elapsed="0.000741"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:09:46.210830" elapsed="0.003270"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:09:46.206032" elapsed="0.008123"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:09:46.205592" elapsed="0.008608"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:09:46.200910" elapsed="0.013343"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:46.216099" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:46.215794" elapsed="0.000335"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:46.216176" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T01:09:46.216330" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:46.215437" elapsed="0.000919"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:46.216844" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:46.216534" elapsed="0.000661">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.217414" elapsed="0.000024"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.217610" elapsed="0.000021"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:46.217805" elapsed="0.000021"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:46.214995" elapsed="0.002924">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:47.220867" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:47.219946" elapsed="0.000968"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:47.220997" elapsed="0.000055"/>
</return>
<msg time="2026-04-11T01:09:47.221237" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:47.219412" elapsed="0.001862"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:47.221897" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:47.221531" elapsed="0.000900">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:47.222772" elapsed="0.000033"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:47.223057" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:47.223343" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:47.218679" elapsed="0.004847">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:48.225628" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:48.225143" elapsed="0.000553"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:48.225812" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:09:48.226164" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:48.224768" elapsed="0.001453"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:48.227150" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:48.226604" elapsed="0.001326">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:48.228550" elapsed="0.000034"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:48.228822" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:48.229098" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:48.224147" elapsed="0.005111">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:49.232925" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:49.232150" elapsed="0.000844"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:49.233114" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:09:49.233502" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:49.231322" elapsed="0.003544"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:49.235577" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:49.235103" elapsed="0.000984">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:49.236406" elapsed="0.000032"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:49.236676" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:49.236944" elapsed="0.000027"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:49.230207" elapsed="0.006895">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:50.240805" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:50.239998" elapsed="0.000879"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:50.240999" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:09:50.241368" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:50.239142" elapsed="0.002319"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:50.243040" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:50.241837" elapsed="0.002102">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:50.244469" elapsed="0.000062"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:50.244962" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:50.245457" elapsed="0.000050"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:50.238063" elapsed="0.007660">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:51.249572" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:51.248797" elapsed="0.000843"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:51.249760" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:09:51.250117" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:51.247895" elapsed="0.002278"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:51.251108" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:51.250561" elapsed="0.001329">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:51.252372" elapsed="0.000080"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:51.252833" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:51.253319" elapsed="0.000051"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:51.246848" elapsed="0.006777">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:52.257619" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:52.256758" elapsed="0.000934"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:52.257815" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:09:52.258192" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:52.255862" elapsed="0.002389"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:52.259254" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:52.258669" elapsed="0.001417">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:52.260581" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:52.261011" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:52.261496" elapsed="0.000052"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:52.254748" elapsed="0.007026">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:53.265473" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:53.264701" elapsed="0.000842"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:53.265661" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:09:53.266013" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:53.263875" elapsed="0.002196"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:53.267018" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:53.266471" elapsed="0.001329">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:53.268258" elapsed="0.000048"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:53.268712" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:53.269145" elapsed="0.000044"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:53.262791" elapsed="0.006630">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:54.273974" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:54.273160" elapsed="0.000887"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:54.274169" elapsed="0.000081"/>
</return>
<msg time="2026-04-11T01:09:54.274578" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:54.272277" elapsed="0.002364"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:54.275681" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:54.275019" elapsed="0.001491">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:54.276998" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:54.277488" elapsed="0.000050"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:54.277966" elapsed="0.000049"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:54.270483" elapsed="0.007755">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:55.281794" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:55.281042" elapsed="0.000819"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:55.281974" elapsed="0.000075"/>
</return>
<msg time="2026-04-11T01:09:55.282318" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:55.280204" elapsed="0.002169"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:55.283445" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:55.282879" elapsed="0.001301">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:55.284673" elapsed="0.000034"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:55.284959" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:55.285250" elapsed="0.000030"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:55.279165" elapsed="0.006273">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:56.289065" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:56.288276" elapsed="0.000858"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:56.289339" elapsed="0.000122"/>
</return>
<msg time="2026-04-11T01:09:56.289767" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:56.287468" elapsed="0.002355"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:56.290759" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:56.290175" elapsed="0.001386">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:56.292019" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:56.292470" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:56.292908" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:56.286333" elapsed="0.006826">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:57.297566" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:57.296189" elapsed="0.001448"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:57.297760" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:09:57.298148" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:57.295358" elapsed="0.002848"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:57.299141" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:57.298594" elapsed="0.001337">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:57.300416" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:57.300848" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:57.301278" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:57.294264" elapsed="0.007310">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:58.305318" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:58.304575" elapsed="0.000838"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:58.305534" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:09:58.305885" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:58.303748" elapsed="0.002194"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:58.306879" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:58.306289" elapsed="0.001362">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:58.308104" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:58.308553" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:58.309149" elapsed="0.000051"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:58.302610" elapsed="0.006843">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:09:59.313077" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:09:59.312309" elapsed="0.000836"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:09:59.313262" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:09:59.313651" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:09:59.311475" elapsed="0.002233"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:09:59.314652" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:09:59.314059" elapsed="0.001414">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:59.315956" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:59.316377" elapsed="0.000077"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:09:59.316850" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:09:59.310431" elapsed="0.006674">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:00.320901" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:00.319945" elapsed="0.001026"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:00.321087" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T01:10:00.321466" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:00.319094" elapsed="0.002430"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:00.322432" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:00.321873" elapsed="0.001917">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:00.324253" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:00.324782" elapsed="0.000032"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:00.325062" elapsed="0.000028"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:00.318024" elapsed="0.007197">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:01.328830" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:01.328060" elapsed="0.000838"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:01.329013" elapsed="0.000128"/>
</return>
<msg time="2026-04-11T01:10:01.329453" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:01.327234" elapsed="0.002277"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:01.330248" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:01.329876" elapsed="0.000895">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:01.331069" elapsed="0.000030"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:01.331334" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:01.331639" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:01.326159" elapsed="0.005639">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:02.335356" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:02.334615" elapsed="0.000972"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:02.335710" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:10:02.336071" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:02.333779" elapsed="0.002349"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:02.337061" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:02.336509" elapsed="0.001348">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:02.338151" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:02.338438" elapsed="0.000030"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:02.338715" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:02.332706" elapsed="0.006170">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:03.342684" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:03.341848" elapsed="0.000908"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:03.342877" elapsed="0.000084"/>
</return>
<msg time="2026-04-11T01:10:03.343234" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:03.340954" elapsed="0.002335"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:03.344270" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:03.343671" elapsed="0.001444">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:03.345642" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:03.346079" elapsed="0.000060"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:03.346574" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:03.339853" elapsed="0.006978">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:04.351036" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:04.350254" elapsed="0.000851"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:04.351221" elapsed="0.000076"/>
</return>
<msg time="2026-04-11T01:10:04.351609" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:04.349427" elapsed="0.002239"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:04.352589" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:04.352019" elapsed="0.001333">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:04.353839" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:04.354267" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:04.354742" elapsed="0.000046"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:04.347785" elapsed="0.007212">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:05.357493" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:05.357021" elapsed="0.000513"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:05.357607" elapsed="0.000053"/>
</return>
<msg time="2026-04-11T01:10:05.357806" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:05.356510" elapsed="0.001325"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:05.358328" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:05.358029" elapsed="0.000823">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:05.359221" elapsed="0.000027"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:05.359472" elapsed="0.000025"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:05.359731" elapsed="0.000027"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:05.355755" elapsed="0.004109">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:06.363432" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:06.362670" elapsed="0.000832"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:06.363621" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:10:06.363969" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:06.361841" elapsed="0.002184"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:06.364957" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:06.364418" elapsed="0.001313">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:06.366187" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:06.366643" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:06.367082" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:06.360806" elapsed="0.006525">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:07.373744" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:07.370272" elapsed="0.003545"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:07.373940" elapsed="0.000088"/>
</return>
<msg time="2026-04-11T01:10:07.374311" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:07.369450" elapsed="0.004916"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:07.375334" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:07.374780" elapsed="0.001441">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:07.376736" elapsed="0.000054"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:07.377077" elapsed="0.000021"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:07.377273" elapsed="0.000021"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:07.368341" elapsed="0.009063">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:08.381271" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:08.380460" elapsed="0.000883"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:08.381500" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T01:10:08.381879" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:08.379502" elapsed="0.002435"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:08.382872" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:08.382293" elapsed="0.001377">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:08.384168" elapsed="0.000053"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:08.384629" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:08.385068" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:08.378330" elapsed="0.007139">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:09.389158" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:09.388378" elapsed="0.000847"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:09.389341" elapsed="0.000110"/>
</return>
<msg time="2026-04-11T01:10:09.389736" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:09.387515" elapsed="0.002277"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:09.390720" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:09.390144" elapsed="0.001342">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:09.391989" elapsed="0.000045"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:09.392301" elapsed="0.000032"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:09.392605" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:09.386445" elapsed="0.006323">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:10.396596" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:10.395777" elapsed="0.000889"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:10.396789" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:10:10.397155" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:10.394895" elapsed="0.002315"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:10.398142" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:10.397590" elapsed="0.001354">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:10.399442" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:10.399885" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:10.400323" elapsed="0.000044"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:10.393775" elapsed="0.006835">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:11.405020" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:11.404237" elapsed="0.000867"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:11.405226" elapsed="0.000083"/>
</return>
<msg time="2026-04-11T01:10:11.405619" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:11.403373" elapsed="0.002302"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:11.406598" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:11.406023" elapsed="0.001394">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:11.407907" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:11.408358" elapsed="0.000073"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:11.408820" elapsed="0.000045"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:11.402306" elapsed="0.006765">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:12.412426" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:12.411681" elapsed="0.000811"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:12.412601" elapsed="0.000074"/>
</return>
<msg time="2026-04-11T01:10:12.413074" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:12.410845" elapsed="0.002285"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:12.414046" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:12.413509" elapsed="0.001278">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:12.415231" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:12.415745" elapsed="0.000048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:12.416160" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:12.409883" elapsed="0.006438">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:13.420481" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:13.419517" elapsed="0.001039"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:13.420680" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:10:13.421099" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:13.418559" elapsed="0.002603"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:13.422129" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:13.421557" elapsed="0.001395">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:13.423527" elapsed="0.000057"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:13.424004" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:13.424484" elapsed="0.000062"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:13.417259" elapsed="0.007546">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:14.429253" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:14.427841" elapsed="0.001482"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:14.429476" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T01:10:14.429848" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:14.426948" elapsed="0.002957"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:14.430839" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:14.430259" elapsed="0.001484">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:14.432211" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:14.432669" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:14.433110" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:14.425858" elapsed="0.007511">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:15.437228" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:15.436465" elapsed="0.000837"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:15.437455" elapsed="0.000085"/>
</return>
<msg time="2026-04-11T01:10:15.437820" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:15.435558" elapsed="0.002317"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:15.438807" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:15.438226" elapsed="0.001381">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:15.440208" elapsed="0.000044"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:15.440672" elapsed="0.000035"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:15.440956" elapsed="0.000029"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:15.434450" elapsed="0.006668">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Flows On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:16.444972" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:16.444138" elapsed="0.000904"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:16.445161" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:10:16.445554" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:16.443260" elapsed="0.002351"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:16.446537" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:16.445960" elapsed="0.001326">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:16.447802" elapsed="0.000051"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${count}</var>
<arg>${resp.text}</arg>
<arg>"priority"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:16.448234" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${count}</arg>
<arg>${flows}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:16.448702" elapsed="0.000047"/>
</kw>
<arg>${all_flows}</arg>
<doc>Check number of flows in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:16.442123" elapsed="0.006833">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T01:10:16.449147" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Flows On Member</arg>
<arg>${all_flows}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:09:46.214436" elapsed="30.234907">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Flows in Operational DS.</doc>
<status status="FAIL" start="2026-04-11T01:09:46.199728" elapsed="30.249981">Keyword 'ClusterOpenFlow.Check Number Of Flows On Member' failed after retrying for 30 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t69" name="Check Groups In Operational DS After Controller Restarts" line="457">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:10:16.455547" elapsed="0.000235"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:10:16.455262" elapsed="0.000578"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:16.456887" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:16.456761" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:16.456738" elapsed="0.000218"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:16.461788" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:16.461681" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:16.461663" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:16.462864" 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-11T01:10:16.462478" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:16.463336" 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-11T01:10:16.463054" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:16.463421" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:10:16.463574" 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-11T01:10:16.462087" elapsed="0.001512"/>
</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-11T01:10:16.463988" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:16.464257" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:10:16.464106" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:10:16.464087" elapsed="0.000247"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:16.463829" elapsed="0.000611"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:16.463656" elapsed="0.000819"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:10:16.461309" elapsed="0.003223"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:10:16.456463" elapsed="0.008125"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:10:16.455998" elapsed="0.008635"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:10:16.452316" elapsed="0.012369"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:16.466549" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:16.466195" elapsed="0.000382"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:16.466624" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:10:16.466774" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:16.465811" elapsed="0.000988"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:16.467214" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:16.466958" elapsed="0.000645">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:16.467816" elapsed="0.000023"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:16.468041" elapsed="0.000023"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:16.468245" elapsed="0.000022"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:16.465429" elapsed="0.002966">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:17.473784" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:17.472141" elapsed="0.001725"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:17.473995" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T01:10:17.474367" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:17.471264" elapsed="0.003191"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:17.475423" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:17.474814" elapsed="0.001465">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:17.476597" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:17.476866" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:17.477136" elapsed="0.000028"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:17.470039" elapsed="0.007271">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:18.481436" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:18.480625" elapsed="0.000880"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:18.481639" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:10:18.481996" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:18.479741" elapsed="0.002312"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:18.482994" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:18.482435" elapsed="0.001332">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:18.484278" elapsed="0.000058"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:18.484633" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:18.485042" elapsed="0.000030"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:18.478612" elapsed="0.006594">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:19.488985" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:19.488167" elapsed="0.000889"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:19.489179" elapsed="0.000089"/>
</return>
<msg time="2026-04-11T01:10:19.489585" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:19.487263" elapsed="0.002381"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:19.490588" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:19.489998" elapsed="0.001352">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:19.491850" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:19.492301" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:19.492771" elapsed="0.000046"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:19.486157" elapsed="0.006872">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:20.496645" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:20.495857" elapsed="0.000857"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:20.496830" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:10:20.497183" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:20.495034" elapsed="0.002206"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:20.498164" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:20.497620" elapsed="0.001910">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:20.500010" elapsed="0.000052"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:20.500483" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:20.500927" elapsed="0.000046"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:20.494007" elapsed="0.007172">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:21.505084" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:21.504200" elapsed="0.000957"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:21.505280" elapsed="0.000087"/>
</return>
<msg time="2026-04-11T01:10:21.505687" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:21.503345" elapsed="0.002398"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:21.506687" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:21.506095" elapsed="0.001654">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:21.508220" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:21.508692" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:21.509133" elapsed="0.000044"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:21.502198" elapsed="0.007232">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:22.513170" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:22.512356" elapsed="0.001075"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:22.513561" elapsed="0.000086"/>
</return>
<msg time="2026-04-11T01:10:22.513932" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:22.511562" elapsed="0.002427"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:22.514932" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:22.514341" elapsed="0.001384">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:22.516191" elapsed="0.000049"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:22.516666" elapsed="0.000049"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:22.517111" elapsed="0.000044"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:22.510451" elapsed="0.006916">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:23.521064" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:23.520219" elapsed="0.000913"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:23.521248" elapsed="0.000077"/>
</return>
<msg time="2026-04-11T01:10:23.521633" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:23.519418" elapsed="0.002272"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:23.522616" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:23.522045" elapsed="0.001311">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:23.523841" elapsed="0.000050"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:23.524263" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:23.524743" elapsed="0.000047"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:23.518325" elapsed="0.006699">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:24.529179" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:24.528346" elapsed="0.000960"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:24.529456" elapsed="0.000082"/>
</return>
<msg time="2026-04-11T01:10:24.529721" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:24.527555" elapsed="0.002200"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:24.530311" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:24.529975" elapsed="0.000837">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:24.531097" elapsed="0.000031"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:24.531364" elapsed="0.000052"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:24.531669" elapsed="0.000029"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:24.525977" elapsed="0.005852">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:25.535481" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:25.534689" elapsed="0.000865"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:25.535675" elapsed="0.000113"/>
</return>
<msg time="2026-04-11T01:10:25.536071" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:25.533838" elapsed="0.002290"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:25.537086" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:25.536521" elapsed="0.001552">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:25.538572" elapsed="0.000202"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:25.539155" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:25.539630" elapsed="0.000049"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:25.532709" elapsed="0.007182">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check Number Of Groups On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:26.543567" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:26.542804" elapsed="0.000834"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:26.543754" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:10:26.544109" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:26.541970" elapsed="0.002196"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:26.545091" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_NODES_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:26.544551" elapsed="0.001355">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:26.546359" elapsed="0.000089"/>
</kw>
<kw name="Get Count" owner="BuiltIn">
<var>${group_count}</var>
<arg>${resp.text}</arg>
<arg>"group-type"</arg>
<doc>Returns and logs how many times ``item`` is found from ``container``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:26.546717" elapsed="0.000035"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${group_count}</arg>
<arg>${groups}</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:26.547000" elapsed="0.000028"/>
</kw>
<arg>${all_groups}</arg>
<doc>Check number of groups in the inventory.</doc>
<status status="FAIL" start="2026-04-11T01:10:26.540892" elapsed="0.006266">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T01:10:26.547277" level="FAIL">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check Number Of Groups On Member</arg>
<arg>${all_groups}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:10:16.464851" elapsed="10.082582">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check Groups in Operational DS.</doc>
<status status="FAIL" start="2026-04-11T01:10:16.450907" elapsed="10.096764">Keyword 'ClusterOpenFlow.Check Number Of Groups On Member' failed after retrying for 10 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s4-t70" name="Check Flows In Switch After Controller Restarts" line="465">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:10:26.554071" elapsed="0.000300"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:10:26.553696" elapsed="0.000778"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:26.555526" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:26.555396" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:26.555358" elapsed="0.000237"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:26.560407" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:26.560285" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:26.560266" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:26.561477" 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-11T01:10:26.561084" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:26.561963" 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-11T01:10:26.561680" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:26.562033" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:10:26.562187" 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-11T01:10:26.560713" elapsed="0.001498"/>
</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-11T01:10:26.562588" 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-11T01:10:26.562908" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:10:26.562684" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:10:26.562667" elapsed="0.000321"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:26.562441" elapsed="0.000571"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:26.562267" elapsed="0.000772"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:10:26.559925" elapsed="0.003167"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:10:26.555085" elapsed="0.008061"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:10:26.554635" elapsed="0.008555"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:10:26.550052" elapsed="0.013189"/>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<msg time="2026-04-11T01:10:26.567476" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<arg>${all_flows}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-11T01:10:26.563522" elapsed="0.003992">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Check Flows in switch.</doc>
<status status="FAIL" start="2026-04-11T01:10:26.548656" elapsed="0.018992">Variable '${mininet_conn_id}' not found.</status>
</test>
<test id="s1-s4-t71" name="Stop Mininet" line="469">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:10:26.571091" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:10:26.570828" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:26.572320" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:26.572213" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:26.572194" 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-11T01:10:26.577147" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:26.577042" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:26.577024" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:26.578208" 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-11T01:10:26.577839" elapsed="0.000396"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:26.578694" 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-11T01:10:26.578409" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:26.578763" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T01:10:26.578912" 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-11T01:10:26.577449" elapsed="0.001488"/>
</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-11T01:10:26.579279" 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-11T01:10:26.579536" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:10:26.579373" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:10:26.579357" elapsed="0.000255"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:26.579135" elapsed="0.000500"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:26.578988" elapsed="0.000671"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:10:26.576689" elapsed="0.003022"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:10:26.571932" elapsed="0.007831"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:10:26.571516" elapsed="0.008290"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:10:26.568323" elapsed="0.011534"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:26.586344" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:10:26.586045" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:26.586027" elapsed="0.000454"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:26.586896" level="FAIL">No open connection.</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:26.586723" elapsed="0.000491">No open connection.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:26.587399" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:26.587571" elapsed="0.000020"/>
</kw>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="FAIL" start="2026-04-11T01:10:26.584032" elapsed="0.003648">No open connection.</status>
</kw>
<doc>Stop Mininet.</doc>
<status status="FAIL" start="2026-04-11T01:10:26.567928" elapsed="0.019883">No open connection.</status>
</test>
<test id="s1-s4-t72" name="Check No Switches" line="473">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:10:26.591235" elapsed="0.000237"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:10:26.590965" elapsed="0.000562"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:26.592528" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:26.592412" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:26.592377" elapsed="0.000221"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:26.597325" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:26.597220" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:26.597202" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:26.598444" 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-11T01:10:26.598045" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:26.598917" 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-11T01:10:26.598633" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:26.598987" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:10:26.599139" 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-11T01:10:26.597673" elapsed="0.001490"/>
</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-11T01:10:26.599527" 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-11T01:10:26.599771" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:10:26.599624" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:10:26.599608" elapsed="0.000238"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:26.599367" elapsed="0.000502"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:26.599216" elapsed="0.000678"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:10:26.596863" elapsed="0.003083"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:10:26.592109" elapsed="0.007892"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:10:26.591680" elapsed="0.008364"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:10:26.588442" elapsed="0.011652"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:26.601900" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:26.601601" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:26.601972" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:10:26.602117" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:26.601198" elapsed="0.000944"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:26.602564" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:26.602297" elapsed="0.000572">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:26.603074" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:26.603343" elapsed="0.000021"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:10:26.603191" elapsed="0.000274"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:10:26.603141" elapsed="0.000353"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:10:26.600827" elapsed="0.002759">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:27.607934" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:27.607139" elapsed="0.000863"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:27.608121" elapsed="0.000078"/>
</return>
<msg time="2026-04-11T01:10:27.608515" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:27.605690" elapsed="0.002884"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:27.609504" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:27.608932" elapsed="0.001335">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:27.610762" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:27.611415" elapsed="0.000050"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:10:27.611043" elapsed="0.000501"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:10:27.610919" elapsed="0.000687"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:10:27.604617" elapsed="0.007197">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:28.615524" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:28.614745" elapsed="0.000854"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:28.615714" elapsed="0.000079"/>
</return>
<msg time="2026-04-11T01:10:28.616064" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:28.613879" elapsed="0.002242"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:28.617044" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:28.616503" elapsed="0.001323">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:28.618333" elapsed="0.000080"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:28.618996" elapsed="0.000047"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:10:28.618650" elapsed="0.000469"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:10:28.618527" elapsed="0.000653"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:10:28.612833" elapsed="0.006576">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:29.624201" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:29.622262" elapsed="0.002009"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:29.624414" elapsed="0.000080"/>
</return>
<msg time="2026-04-11T01:10:29.624771" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:29.621475" elapsed="0.003351"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:29.625734" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:29.625172" elapsed="0.001385">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:29.627015" elapsed="0.000048"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:29.627658" elapsed="0.000046"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:10:29.627288" elapsed="0.000492"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:10:29.627169" elapsed="0.000672"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:10:29.620456" elapsed="0.007587">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:30.631764" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:30.630988" elapsed="0.000978"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:30.632091" elapsed="0.000586"/>
</return>
<msg time="2026-04-11T01:10:30.632973" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:30.630133" elapsed="0.002898"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:30.633974" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:30.633425" elapsed="0.001382">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:30.635264" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:30.635922" elapsed="0.000046"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:10:30.635578" elapsed="0.000470"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:10:30.635452" elapsed="0.000657"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:10:30.629070" elapsed="0.007245">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Check No Switches On Member" owner="ClusterOpenFlow">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.639869" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:31.639087" elapsed="0.000847"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-11T01:10:31.640050" elapsed="0.000074"/>
</return>
<msg time="2026-04-11T01:10:31.640428" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-11T01:10:31.638224" elapsed="0.002263"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:31.641372" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${resp}</var>
<arg>${session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.640839" elapsed="0.001383">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.642712" elapsed="0.000051"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${resp.text}</arg>
<arg>openflow:${switch}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.643346" elapsed="0.000072"/>
</kw>
<var name="${switch}"/>
<status status="NOT RUN" start="2026-04-11T01:10:31.643006" elapsed="0.000497"/>
</iter>
<var>${switch}</var>
<value>1</value>
<value>${switches+1}</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.642868" elapsed="0.000695"/>
</for>
<arg>${SWITCHES}</arg>
<doc>Check no switch is in topology</doc>
<status status="FAIL" start="2026-04-11T01:10:31.637229" elapsed="0.006538">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<msg time="2026-04-11T01:10:31.643956" level="FAIL">Keyword 'ClusterOpenFlow.Check No Switches On Member' failed after retrying for 5 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Check No Switches On Member</arg>
<arg>${SWITCHES}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:10:26.600260" elapsed="5.043895">Keyword 'ClusterOpenFlow.Check No Switches On Member' failed after retrying for 5 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<doc>Check no switches in topology.</doc>
<status status="FAIL" start="2026-04-11T01:10:26.588007" elapsed="5.056528">Keyword 'ClusterOpenFlow.Check No Switches On Member' failed after retrying for 5 seconds. The last error was: Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<kw name="Final Phase" type="TEARDOWN">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.647353" level="INFO">${command} = sudo iptables -v -F</msg>
<var>${command}</var>
<arg>sudo iptables -v -F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:31.646711" elapsed="0.000741"/>
</kw>
<kw name="Run Keyword And Ignore Error" 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-11T01:10:31.651197" 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-11T01:10:31.650773" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.651695" 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-11T01:10:31.651404" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:31.651765" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:10:31.651920" 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-11T01:10:31.650440" 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-11T01:10:31.652284" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:31.652109" elapsed="0.000235"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.651997" elapsed="0.000373"/>
</for>
<arg>${command}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-11T01:10:31.648233" elapsed="0.004270"/>
</kw>
<arg>ClusterManagement.Run_Bash_Command_On_List_Or_All</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:10:31.647816" elapsed="0.004734"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:31.655099" level="FAIL">InvalidURL: Invalid URL 'http://:8181/rests/data/opendaylight-inventory:nodes': No host supplied</msg>
<arg>session</arg>
<arg>url=${RFC8040_NODES_API}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.653066" elapsed="0.002968">InvalidURL: Invalid URL 'http://:8181/rests/data/opendaylight-inventory:nodes': No host supplied</status>
</kw>
<arg>RequestsLibrary.DELETE On Session</arg>
<arg>session</arg>
<arg>url=${RFC8040_NODES_API}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:10:31.652716" elapsed="0.003386"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:31.656341" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-11T01:10:31.656261" elapsed="0.000163"/>
</kw>
<doc>Delete all sessions.</doc>
<status status="PASS" start="2026-04-11T01:10:31.646187" elapsed="0.010290"/>
</kw>
<doc>Switch connections and cluster are restarted.</doc>
<status status="FAIL" start="2026-04-11T00:52:24.299494" elapsed="1087.357014"/>
</suite>
<suite id="s1-s5" name="010 Switch Disconnect" source="/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/EntityOwnership/010_Switch_Disconnect.robot">
<kw name="Start Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.803188" 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-11T01:10:31.799081" elapsed="0.004165"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-11T01:10:31.798822" elapsed="0.004496"/>
</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-11T01:10:31.808058" 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-11T01:10:31.804413" elapsed="0.003673"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-11T01:10:31.808285" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:31.808174" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:31.808150" elapsed="0.000205"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.808889" 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-11T01:10:31.808537" elapsed="0.000396"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.809429" 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-11T01:10:31.809106" elapsed="0.000350"/>
</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-11T01:10:31.810016" elapsed="0.000281"/>
</kw>
<msg time="2026-04-11T01:10:31.810410" level="INFO">${status} = PASS</msg>
<msg time="2026-04-11T01:10:31.810459" 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-11T01:10:31.809634" elapsed="0.000848"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.811049" 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-11T01:10:31.810663" elapsed="0.000413"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.812184" 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-11T01:10:31.811920" elapsed="0.000291"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.812640" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T01:10:31.812370" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.813154" 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-11T01:10:31.812836" elapsed="0.000345"/>
</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-11T01:10:31.815768" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:31.815565" elapsed="0.000276"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.813238" elapsed="0.002632"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.816454" 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-11T01:10:31.816041" elapsed="0.000458"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.817072" 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-11T01:10:31.816675" elapsed="0.000439"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.817683" 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-11T01:10:31.817284" elapsed="0.000440"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-11T01:10:31.811462" elapsed="0.006367"/>
</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-11T01:10:31.804053" elapsed="0.013832"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.818061" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:31.817949" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:31.817931" elapsed="0.000196"/>
</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-11T01:10:31.821170" 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-11T01:10:31.820797" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.821666" 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-11T01:10:31.821366" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:31.821736" elapsed="0.000037"/>
</return>
<msg time="2026-04-11T01:10:31.821898" 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-11T01:10:31.820461" elapsed="0.001461"/>
</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-11T01:10:31.822265" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:31.822081" elapsed="0.000243"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.821974" 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-11T01:10:31.818353" elapsed="0.004065"/>
</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-11T01:10:31.822583" 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-11T01:10:31.823130" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:31.822980" elapsed="0.000215"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.822839" elapsed="0.000382"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-11T01:10:31.803617" elapsed="0.019657"/>
</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-11T01:10:31.825871" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:31.825764" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:31.825746" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.830538" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:31.830433" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:31.830415" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.831572" 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-11T01:10:31.831184" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.832051" 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-11T01:10:31.831768" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:31.832120" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:10:31.832270" 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-11T01:10:31.830831" elapsed="0.001463"/>
</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-11T01:10:31.832654" 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-11T01:10:31.832911" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:10:31.832754" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:10:31.832738" elapsed="0.000248"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:31.832504" elapsed="0.000505"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.832344" elapsed="0.000689"/>
</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-11T01:10:31.830141" elapsed="0.002981"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-11T01:10:31.823874" elapsed="0.009303"/>
</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-11T01:10:31.823450" elapsed="0.009767"/>
</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-11T01:10:31.798471" elapsed="0.034795"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-11T01:10:31.833778" level="INFO">${mininet_conn_id} = 7</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-11T01:10:31.833446" elapsed="0.000358"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.834288" level="INFO">${mininet_conn_id} = 7</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-11T01:10:31.833980" elapsed="0.000350"/>
</kw>
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-11T01:10:31.834728" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-11T01:10:31.835003" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${TOOLS_SYSTEM_USER}</arg>
<arg>${USER_HOME}/.ssh/id_rsa</arg>
<arg>any</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.834512" elapsed="0.001020">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/EntityOwnership/../../../libraries/DynamicMininet.py</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.835720" elapsed="0.000022"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo ovs-vsctl set-manager ptcp:6644</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.835904" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo mn -c</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.836077" elapsed="0.000020"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${START_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.836247" elapsed="0.000019"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.836433" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${cntls_list}</var>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.836608" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${switch_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.836786" elapsed="0.000200"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.837240" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${switch_list}</arg>
<arg>s${sid}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.837436" elapsed="0.000021"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:31.837095" elapsed="0.000396"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.837035" elapsed="0.000482"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${active_member}</arg>
<arg>1</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.837683" elapsed="0.000020"/>
</kw>
<kw name="Setup Clustered Controller For Switches" owner="OvsManager">
<arg>${switch_list}</arg>
<arg>${cntls_list}</arg>
<doc>The idea of this keyword is to setup clustered controller and to be more or less sure that the role is filled correctly. The problem is when
more controllers are being set up at once, the role shown in Controller ovsdb table is not the same as we can see from wireshark traces.
Now we set disconnected controllers and we will connect them expecting that the first connected controller will be master.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.837974" elapsed="0.000023"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Verify Switch Connections Running On Member</arg>
<arg>${SWITCHES}</arg>
<arg>1</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.838167" elapsed="0.000020"/>
</kw>
<status status="FAIL" start="2026-04-11T01:10:31.798133" elapsed="0.040163">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s5-t1" name="Switches To Be Connected To All Nodes" line="28">
<doc>Initial check for correct connected topology.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.838358" elapsed="0.000469">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s5-t2" name="Reconnecting Switch s1" line="32">
<status status="FAIL" start="2026-04-11T01:10:31.839121" elapsed="0.000326">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s5-t3" name="Switches Still Be Connected To All Nodes" line="34">
<status status="FAIL" start="2026-04-11T01:10:31.839700" elapsed="0.000332">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="End Suite" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:31.840779" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-11T01:10:31.840705" elapsed="0.000124"/>
</kw>
<kw name="Stop Mininet" owner="Utils">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.841727" level="INFO">Stop the test on the base edition</msg>
<arg>Stop the test on the base edition</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:10:31.841499" elapsed="0.000273"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn_id}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-11T01:10:31.841971" elapsed="0.000142"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-11T01:10:31.842471" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.842302" elapsed="0.000587">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:31.843316" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.843148" elapsed="0.000609">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-11T01:10:31.844159" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${prompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.843967" elapsed="0.000702">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-11T01:10:31.844882" elapsed="0.000106"/>
</kw>
<doc>Cleanup/Shutdown work that should be done at the completion of all
tests</doc>
<status status="FAIL" start="2026-04-11T01:10:31.841054" elapsed="0.004048">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) Cannot open session, you need to establish a connection first.</status>
</kw>
<status status="FAIL" start="2026-04-11T01:10:31.840480" elapsed="0.004733">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) Cannot open session, you need to establish a connection first.</status>
</kw>
<doc>Test suite for entity ownership service and openflowplugin. Makes changes on switch side.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.657518" elapsed="0.187750">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) Cannot open session, you need to establish a connection first.</status>
</suite>
<suite id="s1-s6" name="020 Cluster Node Failure" source="/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/EntityOwnership/020_Cluster_Node_Failure.robot">
<kw name="Start Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.929900" 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-11T01:10:31.925886" elapsed="0.004060"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-11T01:10:31.925660" elapsed="0.004346"/>
</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-11T01:10:31.934628" 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-11T01:10:31.931076" elapsed="0.003580"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-11T01:10:31.934833" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:31.934734" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:31.934713" elapsed="0.000181"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.935450" 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-11T01:10:31.935084" elapsed="0.000410"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.935972" 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-11T01:10:31.935665" elapsed="0.000333"/>
</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-11T01:10:31.936526" elapsed="0.000279"/>
</kw>
<msg time="2026-04-11T01:10:31.936900" level="INFO">${status} = PASS</msg>
<msg time="2026-04-11T01:10:31.936947" 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-11T01:10:31.936170" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.937528" 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-11T01:10:31.937144" elapsed="0.000411"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.938529" 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-11T01:10:31.938250" elapsed="0.000305"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.938969" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T01:10:31.938713" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.939475" 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-11T01:10:31.939174" elapsed="0.000328"/>
</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-11T01:10:31.942042" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:31.941847" elapsed="0.000266"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.939552" elapsed="0.002588"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.942731" 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-11T01:10:31.942311" elapsed="0.000464"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.943369" 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-11T01:10:31.942947" elapsed="0.000519"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.944027" 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-11T01:10:31.943643" elapsed="0.000427"/>
</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-11T01:10:31.937798" elapsed="0.006331"/>
</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-11T01:10:31.930723" elapsed="0.013461"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.944357" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:31.944247" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:31.944229" elapsed="0.000209"/>
</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-11T01:10:31.947449" 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-11T01:10:31.947058" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.947928" 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-11T01:10:31.947646" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:31.947998" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:10:31.948150" 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-11T01:10:31.946715" 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-11T01:10:31.948529" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:31.948332" elapsed="0.000257"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.948225" elapsed="0.000390"/>
</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-11T01:10:31.944662" elapsed="0.004005"/>
</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-11T01:10:31.948860" elapsed="0.000211"/>
</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-11T01:10:31.949397" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:31.949238" elapsed="0.000225"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.949122" elapsed="0.000366"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-11T01:10:31.930280" elapsed="0.019261"/>
</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-11T01:10:31.952079" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:31.951972" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:31.951954" 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-11T01:10:31.956672" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:31.956567" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:31.956550" elapsed="0.000187"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.957681" 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-11T01:10:31.957291" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.958181" 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-11T01:10:31.957898" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:31.958251" elapsed="0.000027"/>
</return>
<msg time="2026-04-11T01:10:31.958416" 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-11T01:10:31.956964" elapsed="0.001478"/>
</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-11T01:10:31.958788" 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-11T01:10:31.959103" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:10:31.958882" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:10:31.958865" elapsed="0.000318"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:31.958637" elapsed="0.000570"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.958493" elapsed="0.000738"/>
</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-11T01:10:31.956275" elapsed="0.003008"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-11T01:10:31.950118" elapsed="0.009217"/>
</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-11T01:10:31.949702" elapsed="0.009673"/>
</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-11T01:10:31.925327" elapsed="0.034114"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-11T01:10:31.959901" level="INFO">${mininet_conn_id} = 8</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-11T01:10:31.959601" elapsed="0.000325"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.960424" level="INFO">${mininet_conn_id} = 8</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-11T01:10:31.960101" elapsed="0.000365"/>
</kw>
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-11T01:10:31.960838" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-11T01:10:31.961057" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${TOOLS_SYSTEM_USER}</arg>
<arg>${USER_HOME}/.ssh/id_rsa</arg>
<arg>any</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.960630" elapsed="0.000856">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/EntityOwnership/../../../libraries/DynamicMininet.py</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.961671" elapsed="0.000021"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo ovs-vsctl set-manager ptcp:6644</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.961858" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo mn -c</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.962030" elapsed="0.000020"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${START_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.962198" elapsed="0.000019"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.962367" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${cntls_list}</var>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.962555" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${switch_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.962732" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.963001" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${switch_list}</arg>
<arg>s${sid}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.963181" elapsed="0.000020"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:31.962853" elapsed="0.000381"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:31.962796" elapsed="0.000463"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${active_member}</arg>
<arg>1</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.963436" elapsed="0.000021"/>
</kw>
<kw name="Setup Clustered Controller For Switches" owner="OvsManager">
<arg>${switch_list}</arg>
<arg>${cntls_list}</arg>
<doc>The idea of this keyword is to setup clustered controller and to be more or less sure that the role is filled correctly. The problem is when
more controllers are being set up at once, the role shown in Controller ovsdb table is not the same as we can see from wireshark traces.
Now we set disconnected controllers and we will connect them expecting that the first connected controller will be master.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.963729" elapsed="0.000024"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Verify Switch Connections Running On Member</arg>
<arg>${SWITCHES}</arg>
<arg>1</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:31.963920" elapsed="0.000020"/>
</kw>
<status status="FAIL" start="2026-04-11T01:10:31.925044" elapsed="0.038995">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s6-t1" name="Switches To Be Connected To All Nodes" line="28">
<doc>Initial check for correct connected topology.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.964092" elapsed="0.001502">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t2" name="Restarting Owner Of Switch s1" line="32">
<status status="FAIL" start="2026-04-11T01:10:31.965857" elapsed="0.000347">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t3" name="Switches Still Be Connected To All Nodes" line="34">
<status status="FAIL" start="2026-04-11T01:10:31.966489" elapsed="0.000340">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="End Suite" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-11T01:10:31.967593" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-11T01:10:31.967519" elapsed="0.000123"/>
</kw>
<kw name="Stop Mininet" owner="Utils">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:10:31.968413" level="INFO">Stop the test on the base edition</msg>
<arg>Stop the test on the base edition</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:10:31.968176" elapsed="0.000283"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn_id}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-11T01:10:31.968695" elapsed="0.000138"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-11T01:10:31.969164" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.969023" elapsed="0.000570">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:31.969957" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.969793" elapsed="0.000570">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-11T01:10:31.970780" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${prompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-11T01:10:31.970593" elapsed="0.000716">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-11T01:10:31.971538" elapsed="0.000103"/>
</kw>
<doc>Cleanup/Shutdown work that should be done at the completion of all
tests</doc>
<status status="FAIL" start="2026-04-11T01:10:31.967865" elapsed="0.003893">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) Cannot open session, you need to establish a connection first.</status>
</kw>
<status status="FAIL" start="2026-04-11T01:10:31.967276" elapsed="0.004587">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) Cannot open session, you need to establish a connection first.</status>
</kw>
<doc>Test suite for entity ownership service and openflowplugin. Makes changes on controller side (restart karaf)</doc>
<status status="FAIL" start="2026-04-11T01:10:31.846069" elapsed="0.125845">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) Cannot open session, you need to establish a connection first.</status>
</suite>
<suite id="s1-s7" name="030 Cluster Sync Problems" source="/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/EntityOwnership/030_Cluster_Sync_Problems.robot">
<kw name="Start Suite" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.062282" 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-11T01:10:32.058156" elapsed="0.004175"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-11T01:10:32.057924" elapsed="0.004484"/>
</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-11T01:10:32.067185" 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-11T01:10:32.063561" elapsed="0.003653"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-11T01:10:32.067416" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:32.067294" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:32.067273" elapsed="0.000208"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.068018" 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-11T01:10:32.067647" elapsed="0.000415"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.068566" 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-11T01:10:32.068236" elapsed="0.000357"/>
</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-11T01:10:32.069132" elapsed="0.000295"/>
</kw>
<msg time="2026-04-11T01:10:32.069526" level="INFO">${status} = PASS</msg>
<msg time="2026-04-11T01:10:32.069574" 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-11T01:10:32.068782" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.070181" 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-11T01:10:32.069803" elapsed="0.000405"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.071237" 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-11T01:10:32.070954" elapsed="0.000311"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.071699" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T01:10:32.071443" elapsed="0.000290"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.072193" 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-11T01:10:32.071906" elapsed="0.000315"/>
</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-11T01:10:32.074675" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:32.074478" elapsed="0.000279"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.072272" elapsed="0.002514"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.075454" 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-11T01:10:32.075003" elapsed="0.000496"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.076091" 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-11T01:10:32.075676" elapsed="0.000458"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.076715" 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-11T01:10:32.076309" 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-11T01:10:32.070475" elapsed="0.006346"/>
</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-11T01:10:32.063193" elapsed="0.013684"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.077056" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:32.076942" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:32.076923" elapsed="0.000199"/>
</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-11T01:10:32.080368" 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-11T01:10:32.079993" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.080867" 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-11T01:10:32.080582" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:32.080937" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T01:10:32.081091" 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-11T01:10:32.079654" elapsed="0.001462"/>
</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-11T01:10:32.081472" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:32.081275" elapsed="0.000258"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.081167" elapsed="0.000391"/>
</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-11T01:10:32.077349" elapsed="0.004261"/>
</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-11T01:10:32.081777" elapsed="0.000204"/>
</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-11T01:10:32.082290" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:32.082145" elapsed="0.000209"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.082030" elapsed="0.000362"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-11T01:10:32.062706" elapsed="0.019742"/>
</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-11T01:10:32.085012" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:32.084905" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:32.084887" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.089673" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:32.089569" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:32.089551" elapsed="0.000188"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.090689" 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-11T01:10:32.090297" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.091200" 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-11T01:10:32.090888" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:32.091270" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:10:32.091439" 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-11T01:10:32.089967" elapsed="0.001497"/>
</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-11T01:10:32.091856" 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-11T01:10:32.092107" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:10:32.091953" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:10:32.091936" elapsed="0.000245"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:32.091703" elapsed="0.000501"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.091552" elapsed="0.000676"/>
</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-11T01:10:32.089273" elapsed="0.003007"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-11T01:10:32.083043" elapsed="0.009291"/>
</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-11T01:10:32.082608" elapsed="0.009766"/>
</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-11T01:10:32.057584" elapsed="0.034857"/>
</kw>
<status status="PASS" start="2026-04-11T01:10:32.057280" elapsed="0.035207"/>
</kw>
<test id="s1-s7-t1" name="Start Mininet To All Nodes" line="31">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:10:32.095539" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:10:32.095245" elapsed="0.000554"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.096789" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:32.096683" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:32.096664" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.101749" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:32.101613" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:32.101589" elapsed="0.000242"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.103054" 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-11T01:10:32.102566" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.103604" 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-11T01:10:32.103270" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:32.103688" elapsed="0.000037"/>
</return>
<msg time="2026-04-11T01:10:32.103885" 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-11T01:10:32.102112" elapsed="0.001801"/>
</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-11T01:10:32.104272" 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-11T01:10:32.104544" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:10:32.104369" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:10:32.104353" elapsed="0.000267"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:32.104118" elapsed="0.000525"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.103967" elapsed="0.000700"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:10:32.101183" elapsed="0.003540"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:10:32.096399" elapsed="0.008385"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:10:32.095960" elapsed="0.008869"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:10:32.093001" elapsed="0.011881"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-11T01:10:32.105359" level="INFO">${mininet_conn_id} = 9</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>prompt=${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-11T01:10:32.105053" elapsed="0.000348"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.105903" level="INFO">${mininet_conn_id} = 9</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-11T01:10:32.105581" elapsed="0.000365"/>
</kw>
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-11T01:10:32.106370" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-11T01:10:32.106626" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${TOOLS_SYSTEM_USER}</arg>
<arg>${USER_HOME}/.ssh/id_rsa</arg>
<arg>any</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-11T01:10:32.106155" elapsed="0.000942">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/EntityOwnership/../../../libraries/DynamicMininet.py</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.107291" elapsed="0.000022"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo ovs-vsctl set-manager ptcp:6644</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.107493" elapsed="0.000022"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo mn -c</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.107678" elapsed="0.000020"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${START_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.107867" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.108042" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${cntls_list}</var>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.108216" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${switch_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.108415" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.108683" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${switch_list}</arg>
<arg>s${sid}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.108871" elapsed="0.000021"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:32.108542" elapsed="0.000383"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.108482" elapsed="0.000468"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${active_member}</arg>
<arg>1</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.109117" elapsed="0.000021"/>
</kw>
<kw name="Setup Clustered Controller For Switches" owner="OvsManager">
<arg>${switch_list}</arg>
<arg>${cntls_list}</arg>
<doc>The idea of this keyword is to setup clustered controller and to be more or less sure that the role is filled correctly. The problem is when
more controllers are being set up at once, the role shown in Controller ovsdb table is not the same as we can see from wireshark traces.
Now we set disconnected controllers and we will connect them expecting that the first connected controller will be master.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.109426" elapsed="0.000026"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>15s</arg>
<arg>1s</arg>
<arg>ClusterOpenFlow.Verify Switch Connections Running On Member</arg>
<arg>${SWITCHES}</arg>
<arg>1</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.109625" elapsed="0.000021"/>
</kw>
<status status="FAIL" start="2026-04-11T01:10:32.092531" elapsed="0.017266">OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t2" name="Switches To Be Connected To All Nodes" line="55">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:10:32.113243" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:10:32.112970" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.114537" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:32.114426" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:32.114405" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.119443" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:32.119318" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:32.119299" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.120531" 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-11T01:10:32.120136" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:32.121024" 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-11T01:10:32.120734" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:32.121096" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:10:32.121248" 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-11T01:10:32.119752" elapsed="0.001520"/>
</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-11T01:10:32.121643" 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-11T01:10:32.121904" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:10:32.121748" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:10:32.121729" elapsed="0.000295"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:32.121489" elapsed="0.000559"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.121323" elapsed="0.000750"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:10:32.118939" elapsed="0.003188"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:10:32.114127" elapsed="0.008053"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:10:32.113692" elapsed="0.008532"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:10:32.110627" elapsed="0.011646"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:32.123862" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:32.123624" elapsed="0.000673">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.124495" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.124720" elapsed="0.000021"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.124891" elapsed="0.000019"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.125062" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.125264" elapsed="0.000020"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.125454" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.125637" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.125814" elapsed="0.000021"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.125876" elapsed="0.000016"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:32.123309" elapsed="0.002674">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.126283" elapsed="0.000024"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.126535" elapsed="0.000024"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.126761" elapsed="0.000022"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:32.126982" elapsed="0.000021"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:32.126103" elapsed="0.000960"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:32.126036" elapsed="0.001054"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:32.122917" elapsed="0.004261">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:33.130897" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:33.130279" elapsed="0.001624">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:33.132168" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:33.132527" elapsed="0.000031"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:33.132773" elapsed="0.000028"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:33.133014" elapsed="0.000029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:33.133298" elapsed="0.000029"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:33.133566" elapsed="0.000028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:33.133825" elapsed="0.000028"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:33.134156" elapsed="0.000030"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:33.134249" elapsed="0.000027"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:33.129553" elapsed="0.004870">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:33.134813" elapsed="0.000029"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:33.135138" elapsed="0.000033"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:33.135494" elapsed="0.000033"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:33.135815" elapsed="0.000031"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:33.134609" elapsed="0.001288"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:33.134505" elapsed="0.001430"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:33.127929" elapsed="0.008132">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:34.139036" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:34.138478" elapsed="0.001695">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:34.140623" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:34.140983" elapsed="0.000029"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:34.141221" elapsed="0.000027"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:34.141481" elapsed="0.000030"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:34.141787" elapsed="0.000033"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:34.142184" elapsed="0.000028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:34.142457" elapsed="0.000028"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:34.142711" elapsed="0.000028"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:34.142799" elapsed="0.000026"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:34.137772" elapsed="0.005181">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:34.143338" elapsed="0.000029"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:34.143717" elapsed="0.000035"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:34.144037" elapsed="0.000032"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:34.144354" elapsed="0.000049"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:34.143135" elapsed="0.001321"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:34.143033" elapsed="0.001461"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:34.136777" elapsed="0.007841">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:35.147889" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:35.147276" elapsed="0.002356">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:35.150070" elapsed="0.000053"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:35.150666" elapsed="0.000054"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:35.151072" elapsed="0.000047"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:35.151537" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:35.152042" elapsed="0.000050"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:35.152502" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:35.153259" elapsed="0.000071"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:35.153872" elapsed="0.000053"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:35.154032" elapsed="0.000043"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:35.146575" elapsed="0.007716">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:35.154958" elapsed="0.000046"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:35.155562" elapsed="0.000065"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:35.156140" elapsed="0.000134"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:35.156794" elapsed="0.000061"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:35.154627" elapsed="0.002376"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:35.154454" elapsed="0.002635"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:35.145467" elapsed="0.011850">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:36.160880" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:36.160223" elapsed="0.001755">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:36.162428" elapsed="0.000053"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:36.162981" elapsed="0.000047"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:36.163454" elapsed="0.000050"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:36.163853" elapsed="0.000045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:36.164341" elapsed="0.000073"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:36.164777" elapsed="0.000045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:36.165226" elapsed="0.000046"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:36.165672" elapsed="0.000046"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:36.165817" elapsed="0.000050"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:36.159466" elapsed="0.006617">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:36.166741" elapsed="0.000047"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:36.167257" elapsed="0.000051"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:36.167793" elapsed="0.000050"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:36.168334" elapsed="0.000079"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:36.166375" elapsed="0.002124"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:36.166206" elapsed="0.002352"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:36.158231" elapsed="0.010523">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:37.172092" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:37.171424" elapsed="0.002069">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:37.173920" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:37.174472" elapsed="0.000048"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:37.174892" elapsed="0.000047"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:37.175283" elapsed="0.000045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:37.175965" elapsed="0.000052"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:37.176370" elapsed="0.000076"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:37.176870" elapsed="0.000048"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:37.177295" elapsed="0.000046"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:37.177476" elapsed="0.000043"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:37.170714" elapsed="0.007014">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:37.178487" elapsed="0.000054"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:37.179018" elapsed="0.000053"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:37.179556" elapsed="0.000052"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:37.180116" elapsed="0.000078"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:37.178085" elapsed="0.002215"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:37.177888" elapsed="0.002475"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:37.169604" elapsed="0.011004">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:38.184490" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:38.183911" elapsed="0.001694">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:38.186024" elapsed="0.000049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:38.186576" elapsed="0.000048"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:38.186961" elapsed="0.000044"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:38.187342" elapsed="0.000070"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:38.187823" elapsed="0.000046"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:38.188208" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:38.188647" elapsed="0.000047"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:38.189110" elapsed="0.000047"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:38.189254" elapsed="0.000041"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:38.183189" elapsed="0.006345">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:38.189961" elapsed="0.000020"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:38.190188" elapsed="0.000023"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:38.190426" elapsed="0.000023"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:38.190648" elapsed="0.000022"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:38.189814" elapsed="0.000891"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:38.189663" elapsed="0.001069"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:38.182153" elapsed="0.008668">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:39.194206" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:39.193503" elapsed="0.002126">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:39.196071" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:39.196633" elapsed="0.000049"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:39.197165" elapsed="0.000048"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:39.197614" elapsed="0.000047"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:39.198122" elapsed="0.000047"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:39.198582" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:39.199033" elapsed="0.000048"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:39.199503" elapsed="0.000050"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:39.199659" elapsed="0.000043"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:39.192684" elapsed="0.007237">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:39.200603" elapsed="0.000050"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:39.201153" elapsed="0.000055"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:39.201779" elapsed="0.000064"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:39.202101" elapsed="0.000022"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:39.200224" elapsed="0.001934"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:39.200053" elapsed="0.002134"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:39.191611" elapsed="0.010666">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:40.205978" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:40.204855" elapsed="0.002240">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:40.207546" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:40.208071" elapsed="0.000046"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:40.208481" elapsed="0.000046"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:40.208864" elapsed="0.000044"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:40.209315" elapsed="0.000044"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:40.209753" elapsed="0.000046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:40.210167" elapsed="0.000044"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:40.210602" elapsed="0.000047"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:40.210747" elapsed="0.000041"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:40.204103" elapsed="0.006886">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:40.211626" elapsed="0.000053"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:40.212146" elapsed="0.000052"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:40.212685" elapsed="0.000051"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:40.213190" elapsed="0.000050"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:40.211275" elapsed="0.002045"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:40.211115" elapsed="0.002265"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:40.203020" elapsed="0.010591">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:41.217629" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:41.216808" elapsed="0.002148">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:41.219765" elapsed="0.000065"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:41.220352" elapsed="0.000086"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:41.220920" elapsed="0.000074"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:41.221638" elapsed="0.000073"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:41.222154" elapsed="0.000036"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:41.222556" elapsed="0.000047"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:41.222859" elapsed="0.000022"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:41.223054" elapsed="0.000020"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:41.223123" elapsed="0.000024"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:41.215902" elapsed="0.007353">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:41.223579" elapsed="0.000022"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:41.223816" elapsed="0.000024"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:41.224043" elapsed="0.000023"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:41.224287" elapsed="0.000024"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:41.223423" elapsed="0.000925"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:41.223321" elapsed="0.001056"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:41.214551" elapsed="0.009935">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:42.226247" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:42.225955" elapsed="0.000896">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:42.227297" elapsed="0.000054"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:42.227897" elapsed="0.000054"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:42.228326" elapsed="0.000049"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:42.228793" elapsed="0.000048"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:42.229287" elapsed="0.000047"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:42.229718" elapsed="0.000049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:42.230138" elapsed="0.000045"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:42.230603" elapsed="0.000049"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:42.230754" elapsed="0.000042"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:42.225615" elapsed="0.005383">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:42.231649" elapsed="0.000049"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:42.232168" elapsed="0.000052"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:42.233154" elapsed="0.000057"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:42.233716" elapsed="0.000053"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:42.231286" elapsed="0.002565"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:42.231125" elapsed="0.002787"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:42.225004" elapsed="0.009109">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:43.237582" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:43.236989" elapsed="0.001872">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:43.239321" elapsed="0.000053"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:43.239899" elapsed="0.000055"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:43.240319" elapsed="0.000046"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:43.240745" elapsed="0.000046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:43.241200" elapsed="0.000045"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:43.241618" elapsed="0.000047"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:43.242030" elapsed="0.000043"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:43.242466" elapsed="0.000046"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:43.242608" elapsed="0.000041"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:43.236192" elapsed="0.006717">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:43.243280" elapsed="0.000021"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:43.243527" elapsed="0.000023"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:43.243754" elapsed="0.000022"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:43.243976" elapsed="0.000022"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:43.243131" elapsed="0.000903"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:43.243038" elapsed="0.001024"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:43.235062" elapsed="0.009089">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:44.247538" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:44.246806" elapsed="0.001855">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:44.249087" elapsed="0.000052"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:44.249651" elapsed="0.000050"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:44.250045" elapsed="0.000045"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:44.250466" elapsed="0.000046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:44.250922" elapsed="0.000045"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:44.251348" elapsed="0.000073"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:44.251790" elapsed="0.000044"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:44.252190" elapsed="0.000046"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:44.252331" elapsed="0.000039"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:44.246083" elapsed="0.006517">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:44.253206" elapsed="0.000046"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:44.253746" elapsed="0.000053"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:44.254255" elapsed="0.000051"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:44.254789" elapsed="0.000051"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:44.252881" elapsed="0.002151"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:44.252724" elapsed="0.002399"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:44.244982" elapsed="0.010348">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:45.261158" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:45.260604" elapsed="0.001677">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:45.262752" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:45.263270" elapsed="0.000047"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:45.263722" elapsed="0.000050"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:45.264120" elapsed="0.000045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:45.264605" elapsed="0.000047"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:45.264998" elapsed="0.000045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:45.265437" elapsed="0.000046"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:45.265848" elapsed="0.000045"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:45.265989" elapsed="0.000040"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:45.257293" elapsed="0.008938">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:45.266873" elapsed="0.000046"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:45.267410" elapsed="0.000125"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:45.268111" elapsed="0.000033"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:45.268371" elapsed="0.000041"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:45.266549" elapsed="0.001901"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:45.266355" elapsed="0.002125"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:45.256171" elapsed="0.012403">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:46.271719" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:46.271123" elapsed="0.001773">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.273204" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.273577" elapsed="0.000030"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.273821" elapsed="0.000028"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.274063" elapsed="0.000028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.274348" elapsed="0.000030"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.274621" elapsed="0.000029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.274882" elapsed="0.000028"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.275144" elapsed="0.000029"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:46.275235" elapsed="0.000027"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:46.270416" elapsed="0.004997">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.275825" elapsed="0.000030"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.276145" elapsed="0.000032"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.276481" elapsed="0.000032"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.276896" elapsed="0.000033"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:46.275603" elapsed="0.001376"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:46.275498" elapsed="0.001520"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:46.269323" elapsed="0.007820">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-11T01:10:46.277258" level="FAIL">Keyword 'Check All Switches Connected To All Cluster Nodes' failed after retrying 15 times. The last error was: Cannot open session, you need to establish a connection first.</msg>
<arg>15x</arg>
<arg>1s</arg>
<arg>Check All Switches Connected To All Cluster Nodes</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:10:32.122460" elapsed="14.154945">Keyword 'Check All Switches Connected To All Cluster Nodes' failed after retrying 15 times. The last error was: Cannot open session, you need to establish a connection first.</status>
</kw>
<doc>Initial check for correct connected topology.</doc>
<status status="FAIL" start="2026-04-11T01:10:32.110092" elapsed="14.167528">Keyword 'Check All Switches Connected To All Cluster Nodes' failed after retrying 15 times. The last error was: Cannot open session, you need to establish a connection first.</status>
</test>
<test id="s1-s7-t3" name="Isolating Owner Of Switch s1" line="59">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:10:46.282420" elapsed="0.000337"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:10:46.281978" elapsed="0.000856"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:46.284294" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:46.284165" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:46.284142" elapsed="0.000223"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:46.289151" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:46.289044" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:46.289026" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.290248" 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-11T01:10:46.289863" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.290801" 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-11T01:10:46.290465" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:46.290873" elapsed="0.000032"/>
</return>
<msg time="2026-04-11T01:10:46.291031" 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-11T01:10:46.289476" elapsed="0.001580"/>
</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-11T01:10:46.291430" 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-11T01:10:46.291683" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:10:46.291527" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:10:46.291510" elapsed="0.000248"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:46.291260" elapsed="0.000521"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:46.291110" elapsed="0.000708"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:10:46.288686" elapsed="0.003187"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:10:46.283713" elapsed="0.008214"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:10:46.283065" elapsed="0.008906"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:10:46.278708" elapsed="0.013314"/>
</kw>
<kw name="Isolating Node Scenario">
<kw name="Set Test Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.298280" level="INFO">${isol_node} = </msg>
<arg>${isol_node}</arg>
<arg>${Empty}</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="PASS" start="2026-04-11T01:10:46.292515" elapsed="0.005812"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.298870" level="INFO">${idx} = 1</msg>
<var>${idx}</var>
<arg>str("${switch_name}"[1:])</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:10:46.298515" elapsed="0.000382"/>
</kw>
<kw name="Set Test Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.299359" level="INFO">${idx} = 1</msg>
<arg>${idx}</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="PASS" start="2026-04-11T01:10:46.299068" elapsed="0.000348"/>
</kw>
<kw name="Isolate Switchs Old Owner">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<msg time="2026-04-11T01:10:46.312084" level="FAIL">Variable '${active_member}' not found.</msg>
<var>${old_owner}</var>
<var>${old_successors}</var>
<arg>openflow:${idx}</arg>
<arg>${active_member}</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T01:10:46.308059" elapsed="0.004066">Variable '${active_member}' not found.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${old_master}</var>
<arg>${ODL_SYSTEM_${old_owner}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.312314" elapsed="0.000022"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${active_member}</var>
<arg>${old_successors}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.312513" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${active_member}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.312703" elapsed="0.000020"/>
</kw>
<kw name="Isolate Controller From The Cluster">
<arg>${old_owner}</arg>
<status status="NOT RUN" start="2026-04-11T01:10:46.312845" elapsed="0.000022"/>
</kw>
<kw name="Set Test Variable" owner="BuiltIn">
<arg>${isol_node}</arg>
<arg>${old_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.313028" elapsed="0.000020"/>
</kw>
<kw name="Check OpenFlow Shards Status After Cluster Event" owner="ClusterOpenFlow">
<arg>${old_successors}</arg>
<doc>Check Shards Status after some cluster event.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.313244" elapsed="0.000023"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<var>${new_master}</var>
<arg>10x</arg>
<arg>3s</arg>
<arg>Verify New Master Controller Node</arg>
<arg>${switch_name}</arg>
<arg>${old_master}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.313446" elapsed="0.000021"/>
</kw>
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<var>${owner}</var>
<var>${successors}</var>
<arg>openflow:${idx}</arg>
<arg>${active_member}</arg>
<arg>${old_successors}</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.321260" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${new_master}</arg>
<arg>${ODL_SYSTEM_${owner}_IP}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.321481" elapsed="0.000022"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${active_member}</arg>
<arg>${owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.321671" elapsed="0.000020"/>
</kw>
<kw name="Set Test Variable" owner="BuiltIn">
<arg>${old_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.321852" elapsed="0.000019"/>
</kw>
<kw name="Set Test Variable" owner="BuiltIn">
<arg>${old_successors}</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.322025" elapsed="0.000019"/>
</kw>
<kw name="Set Test Variable" owner="BuiltIn">
<arg>${old_master}</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.322198" elapsed="0.000019"/>
</kw>
<kw name="Set Test Variable" owner="BuiltIn">
<arg>${owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.322372" elapsed="0.000051"/>
</kw>
<kw name="Set Test Variable" owner="BuiltIn">
<arg>${new_master}</arg>
<doc>Makes a variable available everywhere within the scope of the current test.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.322583" elapsed="0.000019"/>
</kw>
<arg>${switch_name}</arg>
<status status="FAIL" start="2026-04-11T01:10:46.299655" elapsed="0.023039">Variable '${active_member}' not found.</status>
</kw>
<kw name="Rejoin Switchs Old Owner">
<arg>${switch_name}</arg>
<status status="NOT RUN" start="2026-04-11T01:10:46.322832" elapsed="0.000022"/>
</kw>
<kw name="Isolate Switchs Successor">
<arg>${switch_name}</arg>
<status status="NOT RUN" start="2026-04-11T01:10:46.323031" elapsed="0.000021"/>
</kw>
<kw name="Rejoin Switchs Successor">
<arg>${switch_name}</arg>
<status status="NOT RUN" start="2026-04-11T01:10:46.323170" elapsed="0.000020"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<arg>"${isol_node}"!="${Empty}"</arg>
<arg>Rejoin Controller To The Cluster</arg>
<arg>${isol_node}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-11T01:10:46.323490" elapsed="0.002086"/>
</kw>
<arg>s1</arg>
<doc>Disconnect and connect owner and successor and check switch data to be consistent</doc>
<status status="FAIL" start="2026-04-11T01:10:46.292187" elapsed="0.033473">Variable '${active_member}' not found.</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.326955" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:10:46.326466" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-11T01:10:46.327200" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:46.327057" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:46.327039" elapsed="0.000223"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:10:46.327465" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.328784" level="FAIL">'6177' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-11T01:10:46.328269" elapsed="0.000578">'6177' does not contain '-'</status>
</kw>
<msg time="2026-04-11T01:10:46.328941" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T01:10:46.327878" elapsed="0.001088"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.329495" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=6177</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T01:10:46.329144" elapsed="0.000379"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.330027" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6177</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:10:46.329695" elapsed="0.000360"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.330531" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:10:46.330221" elapsed="0.000337"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.331100" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6177

Variable '${active_member}' not found.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-11T01:10:46.330722" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.331572" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6177</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:10:46.331313" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.332304" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=6177'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-04-11T01:10:46.331963" elapsed="0.000406"/>
</kw>
<status status="PASS" start="2026-04-11T01:10:46.331686" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:46.331667" elapsed="0.000788"/>
</if>
<arg>6177</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-11T01:10:46.326066" elapsed="0.006435"/>
</kw>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=6177</tag>
<status status="FAIL" start="2026-04-11T01:10:46.278056" elapsed="0.054489">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6177

Variable '${active_member}' not found.</status>
</test>
<test id="s1-s7-t4" name="Switches Still Be Connected To All Nodes" line="62">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:10:46.335966" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:10:46.335668" elapsed="0.000559"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:10:46.337229" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:46.337122" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:46.337103" 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-11T01:10:46.342153" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:10:46.342047" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-11T01:10:46.342029" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.343217" 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-11T01:10:46.342846" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:10:46.343764" 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-11T01:10:46.343427" elapsed="0.000364"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:10:46.343862" elapsed="0.000033"/>
</return>
<msg time="2026-04-11T01:10:46.344028" 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-11T01:10:46.342468" elapsed="0.001585"/>
</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-11T01:10:46.344422" 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-11T01:10:46.344673" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:10:46.344519" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:10:46.344502" elapsed="0.000246"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:10:46.344255" elapsed="0.000515"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:10:46.344105" elapsed="0.000691"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:10:46.341689" elapsed="0.003158"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:10:46.336836" elapsed="0.008064"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:10:46.336406" elapsed="0.008538"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:10:46.333348" elapsed="0.011648"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:46.346583" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:46.346334" elapsed="0.000739">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.347249" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.347478" elapsed="0.000021"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.347650" elapsed="0.000019"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.347821" elapsed="0.000035"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.348048" elapsed="0.000020"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.348223" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.348419" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.348598" elapsed="0.000020"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:46.348660" elapsed="0.000016"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:46.346029" elapsed="0.002734">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.349023" elapsed="0.000020"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.349250" elapsed="0.000023"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.349492" elapsed="0.000023"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:46.349716" elapsed="0.000022"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:46.348882" elapsed="0.000892"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:46.348815" elapsed="0.000984"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:46.345616" elapsed="0.004269">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:47.353589" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:47.353024" elapsed="0.001670">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:47.355115" elapsed="0.000048"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:47.355656" elapsed="0.000047"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:47.356043" elapsed="0.000043"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:47.356497" elapsed="0.000046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:47.356948" elapsed="0.000044"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:47.357225" elapsed="0.000029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:47.357513" elapsed="0.000030"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:47.357786" elapsed="0.000029"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:47.357880" elapsed="0.000029"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:47.352301" elapsed="0.005746">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:47.358474" elapsed="0.000032"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:47.358817" elapsed="0.000041"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:47.359227" elapsed="0.000036"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:47.359589" elapsed="0.000033"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:47.358239" elapsed="0.001436"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:47.358129" elapsed="0.001684"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:47.350650" elapsed="0.009305">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:48.363329" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:48.362777" elapsed="0.001752">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:48.364988" elapsed="0.000052"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:48.365609" elapsed="0.000054"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:48.366064" elapsed="0.000053"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:48.366557" elapsed="0.000066"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:48.367135" elapsed="0.000055"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:48.367591" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:48.368031" elapsed="0.000063"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:48.368546" elapsed="0.000083"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:48.368739" elapsed="0.000044"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:48.362061" elapsed="0.006932">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:48.369658" elapsed="0.000049"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:48.370176" elapsed="0.000055"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:48.370719" elapsed="0.000055"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:48.371225" elapsed="0.000049"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:48.369301" elapsed="0.002053"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:48.369134" elapsed="0.002310"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:48.360998" elapsed="0.010645">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:49.374800" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:49.374222" elapsed="0.002135">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:49.376815" elapsed="0.000052"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:49.377409" elapsed="0.000052"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:49.377809" elapsed="0.000046"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:49.378161" elapsed="0.000028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:49.378470" elapsed="0.000030"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:49.378720" elapsed="0.000029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:49.378979" elapsed="0.000027"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:49.379242" elapsed="0.000028"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:49.379332" elapsed="0.000027"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:49.373548" elapsed="0.005958">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:49.379891" elapsed="0.000029"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:49.380215" elapsed="0.000033"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:49.380555" elapsed="0.000032"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:49.380979" elapsed="0.000034"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:49.379688" elapsed="0.001377"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:49.379585" elapsed="0.001518"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:49.372479" elapsed="0.008748">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:50.384420" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:50.383819" elapsed="0.001787">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:50.386037" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:50.386590" elapsed="0.000049"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:50.386986" elapsed="0.000045"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:50.387373" elapsed="0.000074"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:50.387859" elapsed="0.000048"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:50.388255" elapsed="0.000045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:50.388699" elapsed="0.000045"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:50.389108" elapsed="0.000048"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:50.389253" elapsed="0.000042"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:50.383090" elapsed="0.006480">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:50.390205" elapsed="0.000037"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:50.390567" elapsed="0.000033"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:50.390886" elapsed="0.000032"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:50.391200" elapsed="0.000032"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:50.389860" elapsed="0.001421"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:50.389698" elapsed="0.001620"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:50.382003" elapsed="0.009459">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:51.394704" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:51.394083" elapsed="0.001757">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:51.396292" elapsed="0.000057"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:51.396853" elapsed="0.000048"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:51.397265" elapsed="0.000053"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:51.397698" elapsed="0.000103"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:51.398234" elapsed="0.000036"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:51.398521" elapsed="0.000029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:51.398779" elapsed="0.000029"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:51.399034" elapsed="0.000028"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:51.399131" elapsed="0.000033"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:51.393328" elapsed="0.005993">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:51.399735" elapsed="0.000029"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:51.400168" elapsed="0.000041"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:51.400545" elapsed="0.000033"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:51.400862" elapsed="0.000328"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:51.399530" elapsed="0.001729"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:51.399427" elapsed="0.001881"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:51.392228" elapsed="0.009239">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:52.405063" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:52.404433" elapsed="0.002011">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:52.406910" elapsed="0.000054"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:52.407361" elapsed="0.000046"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:52.407624" elapsed="0.000027"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:52.407860" elapsed="0.000028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:52.408140" elapsed="0.000027"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:52.408380" elapsed="0.000046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:52.408654" elapsed="0.000028"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:52.408910" elapsed="0.000027"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:52.408999" elapsed="0.000028"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:52.403593" elapsed="0.005576">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:52.409641" elapsed="0.000030"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:52.409975" elapsed="0.000033"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:52.410329" elapsed="0.000032"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:52.410666" elapsed="0.000031"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:52.409416" elapsed="0.001331"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:52.409259" elapsed="0.001527"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:52.402316" elapsed="0.008596">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:53.414553" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:53.413831" elapsed="0.002060">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:53.416327" elapsed="0.000053"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:53.416897" elapsed="0.000049"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:53.417296" elapsed="0.000048"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:53.417724" elapsed="0.000046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:53.418188" elapsed="0.000051"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:53.418700" elapsed="0.000051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:53.419233" elapsed="0.000063"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:53.419571" elapsed="0.000030"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:53.419667" elapsed="0.000026"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:53.413042" elapsed="0.006885">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:53.420363" elapsed="0.000071"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:53.420751" elapsed="0.000034"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:53.421071" elapsed="0.000031"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:53.421444" elapsed="0.000042"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:53.420121" elapsed="0.001422"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:53.420014" elapsed="0.001569"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:53.411852" elapsed="0.009861">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:54.425305" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:54.424750" elapsed="0.001683">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:54.426858" elapsed="0.000070"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:54.427428" elapsed="0.000049"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:54.427822" elapsed="0.000047"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:54.428220" elapsed="0.000045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:54.428729" elapsed="0.000048"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:54.429126" elapsed="0.000045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:54.429568" elapsed="0.000046"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:54.429977" elapsed="0.000044"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:54.430117" elapsed="0.000040"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:54.423565" elapsed="0.006790">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:54.431029" elapsed="0.000049"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:54.431411" elapsed="0.000025"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:54.431643" elapsed="0.000022"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:54.431868" elapsed="0.000023"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:54.430666" elapsed="0.001262"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:54.430507" elapsed="0.001448"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:54.422498" elapsed="0.009546">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:55.436169" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:55.435341" elapsed="0.002083">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:55.437713" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:55.438109" elapsed="0.000032"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:55.438358" elapsed="0.000051"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:55.438658" elapsed="0.000030"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:55.438946" elapsed="0.000029"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:55.439209" elapsed="0.000029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:55.439581" elapsed="0.000041"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:55.439981" elapsed="0.000036"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:55.440086" elapsed="0.000029"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:55.434278" elapsed="0.005985">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:55.440724" elapsed="0.000033"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:55.441074" elapsed="0.000035"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:55.441427" elapsed="0.000034"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:55.441751" elapsed="0.000040"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:55.440513" elapsed="0.001345"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:55.440367" elapsed="0.001542"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:55.432841" elapsed="0.009236">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:56.445318" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:56.444750" elapsed="0.001713">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:56.446886" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:56.447458" elapsed="0.000049"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:56.447866" elapsed="0.000047"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:56.448254" elapsed="0.000049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:56.448741" elapsed="0.000046"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:56.449131" elapsed="0.000045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:56.449600" elapsed="0.000046"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:56.450005" elapsed="0.000044"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:56.450146" elapsed="0.000040"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:56.444033" elapsed="0.006348">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:56.451442" elapsed="0.000051"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:56.452013" elapsed="0.000054"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:56.452555" elapsed="0.000052"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:56.453062" elapsed="0.000025"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:56.450693" elapsed="0.002430"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:56.450534" elapsed="0.002616"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:56.442894" elapsed="0.010344">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:57.455473" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:57.455050" elapsed="0.001162">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:57.456508" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:57.456850" elapsed="0.000029"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:57.457093" elapsed="0.000028"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:57.457331" elapsed="0.000027"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:57.457634" elapsed="0.000029"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:57.457874" elapsed="0.000118"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:57.458226" elapsed="0.000028"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:57.458503" elapsed="0.000029"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:57.458595" elapsed="0.000029"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:57.454610" elapsed="0.004145">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:57.459145" elapsed="0.000029"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:57.459486" elapsed="0.000033"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:57.459799" elapsed="0.000031"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:57.460122" elapsed="0.000032"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:57.458940" elapsed="0.001265"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:57.458838" elapsed="0.001406"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:57.453849" elapsed="0.006518">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:58.463596" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:58.462969" elapsed="0.001869">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:58.465327" elapsed="0.000038"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:58.465717" elapsed="0.000032"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:58.465968" elapsed="0.000029"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:58.466218" elapsed="0.000030"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:58.466547" elapsed="0.000030"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:58.466803" elapsed="0.000030"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:58.467066" elapsed="0.000030"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:58.467336" elapsed="0.000032"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:58.467456" elapsed="0.000029"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:58.462235" elapsed="0.005382">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:58.468011" elapsed="0.000031"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:58.468349" elapsed="0.000055"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:58.468716" elapsed="0.000034"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:58.469040" elapsed="0.000034"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:58.467802" elapsed="0.001324"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:58.467699" elapsed="0.001467"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:58.461112" elapsed="0.008181">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:10:59.473127" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:10:59.472418" elapsed="0.001612">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:59.474301" elapsed="0.000031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:59.474672" elapsed="0.000029"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:59.474913" elapsed="0.000028"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:59.475154" elapsed="0.000027"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:59.475556" elapsed="0.000031"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:10:59.475807" elapsed="0.000028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:59.476063" elapsed="0.000028"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:59.476322" elapsed="0.000027"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:10:59.476433" elapsed="0.000032"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:10:59.471698" elapsed="0.004908">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:10:59.477016" elapsed="0.000030"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:59.477339" elapsed="0.000033"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:59.477681" elapsed="0.000032"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:10:59.477993" elapsed="0.000030"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:10:59.476796" elapsed="0.001276"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:10:59.476689" elapsed="0.001423"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:10:59.470057" elapsed="0.008178">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check All Switches Connected To All Cluster Nodes">
<kw name="Get Ovsdb Data" owner="OvsManager">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-11T01:11:00.481335" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${lcmd_prefix} ${SH_BR_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.480755" elapsed="0.001747">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${brstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.482925" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${brstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.483473" elapsed="0.000049"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${lcmd_prefix} ${SH_CNTL_CMD}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.483864" elapsed="0.000045"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${cntlstdout}</var>
<arg>${lprompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.484247" elapsed="0.000045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${cntlstdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.484728" elapsed="0.000047"/>
</kw>
<kw name="Parse" owner="VsctlListParser">
<var>${data}</var>
<var>${bridegs}</var>
<var>${controllers}</var>
<arg>${brstdout}</arg>
<arg>${cntlstdout}</arg>
<doc>Produces dictionary with data for future usege</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.485120" elapsed="0.000046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.485615" elapsed="0.000049"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovs_switch_data}</arg>
<arg>${data}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.486027" elapsed="0.000045"/>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.486168" elapsed="0.000040"/>
</return>
<doc>Gets ovs data and parse them.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.480045" elapsed="0.006372">Cannot open session, you need to establish a connection first.</status>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Evaluate" owner="BuiltIn">
<var>${sid}</var>
<arg>${i}+1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.486804" elapsed="0.000030"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_1_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.487127" elapsed="0.000032"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_2_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.487461" elapsed="0.000033"/>
</kw>
<kw name="Should Be Connected" owner="OvsManager">
<arg>s${sid}</arg>
<arg>${ODL_SYSTEM_3_IP}</arg>
<arg>update_data=${False}</arg>
<doc>Check if the switch is connected</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.487776" elapsed="0.000031"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:11:00.486600" elapsed="0.001257"/>
</iter>
<var>${i}</var>
<value>0</value>
<value>${SWITCHES}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.486496" elapsed="0.001398"/>
</for>
<doc>Verifies all switches are connected to all cluster nodes</doc>
<status status="FAIL" start="2026-04-11T01:11:00.478970" elapsed="0.009047">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-11T01:11:00.488133" level="FAIL">Keyword 'Check All Switches Connected To All Cluster Nodes' failed after retrying 15 times. The last error was: Cannot open session, you need to establish a connection first.</msg>
<arg>15x</arg>
<arg>1s</arg>
<arg>Check All Switches Connected To All Cluster Nodes</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:10:46.345168" elapsed="14.143097">Keyword 'Check All Switches Connected To All Cluster Nodes' failed after retrying 15 times. The last error was: Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.490030" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:11:00.489400" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-11T01:11:00.490498" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:00.490270" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:00.490242" elapsed="0.000347"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:00.490851" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.492680" level="FAIL">'6177' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.491954" elapsed="0.000809">'6177' does not contain '-'</status>
</kw>
<msg time="2026-04-11T01:11:00.492894" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T01:11:00.491415" elapsed="0.001513"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.493717" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=6177</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T01:11:00.493180" elapsed="0.000574"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.494446" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6177</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:00.494002" elapsed="0.000488"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.494971" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:11:00.494679" elapsed="0.000318"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.495547" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6177

Keyword 'Check All Switches Connected To All Cluster Nodes' failed after retrying 15 times. The last error was: Cannot open session, you need to establish a connection first.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-11T01:11:00.495161" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.495998" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6177</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:00.495758" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.496730" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=6177'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-04-11T01:11:00.496372" elapsed="0.000405"/>
</kw>
<status status="PASS" start="2026-04-11T01:11:00.496108" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:00.496090" elapsed="0.000746"/>
</if>
<arg>6177</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-11T01:11:00.488867" elapsed="0.008013"/>
</kw>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=6177</tag>
<status status="FAIL" start="2026-04-11T01:10:46.332875" elapsed="14.164050">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6177

Keyword 'Check All Switches Connected To All Cluster Nodes' failed after retrying 15 times. The last error was: Cannot open session, you need to establish a connection first.</status>
</test>
<test id="s1-s7-t5" name="Stop Mininet And Verify No Owners" line="66">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-11T01:11:00.500212" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-11T01:11:00.499943" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.501504" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:00.501379" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:00.501360" 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-11T01:11:00.506397" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:00.506278" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:00.506260" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.507475" 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-11T01:11:00.507082" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.507960" 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-11T01:11:00.507676" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:00.508030" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T01:11:00.508185" 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-11T01:11:00.506701" elapsed="0.001508"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.508631" 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-11T01:11:00.508886" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:11:00.508729" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:11:00.508712" elapsed="0.000252"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:11:00.508477" elapsed="0.000511"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.508262" elapsed="0.000751"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-11T01:11:00.505925" elapsed="0.003142"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-11T01:11:00.501083" elapsed="0.008038"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:00.500648" elapsed="0.008518"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-11T01:11:00.497844" elapsed="0.011374"/>
</kw>
<kw name="Stop Mininet" owner="Utils">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.510236" level="INFO">Stop the test on the base edition</msg>
<arg>Stop the test on the base edition</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:00.509848" elapsed="0.000435"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn_id}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-11T01:11:00.510501" elapsed="0.000141"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-11T01:11:00.510969" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.510830" elapsed="0.000604">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.511636" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${prompt}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.511845" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.512051" elapsed="0.000019"/>
</kw>
<doc>Cleanup/Shutdown work that should be done at the completion of all
tests</doc>
<status status="FAIL" start="2026-04-11T01:11:00.509479" elapsed="0.002677">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>15x</arg>
<arg>1s</arg>
<arg>Check No Device Owners In Controller</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.512330" elapsed="0.000020"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.513646" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:11:00.513107" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-11T01:11:00.513889" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:00.513749" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:00.513731" elapsed="0.000220"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:00.514134" elapsed="0.000209"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.515246" level="FAIL">'6177' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.514907" elapsed="0.000397">'6177' does not contain '-'</status>
</kw>
<msg time="2026-04-11T01:11:00.515409" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T01:11:00.514530" elapsed="0.000904"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.515937" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=6177</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T01:11:00.515611" elapsed="0.000352"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.516441" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6177</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:00.516141" elapsed="0.000327"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.516918" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:11:00.516633" elapsed="0.000311"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.517487" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6177

Cannot open session, you need to establish a connection first.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-11T01:11:00.517105" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.517928" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6177</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:00.517696" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.518705" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=6177'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-04-11T01:11:00.518354" elapsed="0.000399"/>
</kw>
<status status="PASS" start="2026-04-11T01:11:00.518090" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:00.518070" elapsed="0.000742"/>
</if>
<arg>6177</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-11T01:11:00.512751" elapsed="0.006106"/>
</kw>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=6177</tag>
<status status="FAIL" start="2026-04-11T01:11:00.497336" elapsed="0.021564">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=6177

Cannot open session, you need to establish a connection first.</status>
</test>
<kw name="End Suite" type="TEARDOWN">
<kw name="Flush_Iptables_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.523582" level="INFO">${command} = sudo iptables -v -F</msg>
<var>${command}</var>
<arg>sudo iptables -v -F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:00.523299" elapsed="0.000310"/>
</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-11T01:11:00.524986" 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-11T01:11:00.524611" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.525497" 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-11T01:11:00.525181" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:00.525568" elapsed="0.000030"/>
</return>
<msg time="2026-04-11T01:11:00.525723" 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-11T01:11:00.524267" elapsed="0.001481"/>
</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-11T01:11:00.526096" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:11:00.525908" elapsed="0.000248"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.525800" elapsed="0.000382"/>
</for>
<msg time="2026-04-11T01:11:00.526268" level="INFO">${output} = None</msg>
<var>${output}</var>
<arg>command=${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-11T01:11:00.523828" elapsed="0.002465"/>
</kw>
<doc>If the list is empty, flush IPTables in all ODL instances. Otherwise, flush member based on present indices.</doc>
<status status="PASS" start="2026-04-11T01:11:00.519695" elapsed="0.006655"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-11T01:11:00.526597" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-11T01:11:00.526520" elapsed="0.000127"/>
</kw>
<status status="PASS" start="2026-04-11T01:11:00.519419" elapsed="0.007278"/>
</kw>
<doc>Test suite for entity ownership service and openflowplugin. Makes changes on controller side (isolating cluster node)</doc>
<status status="FAIL" start="2026-04-11T01:10:31.972746" elapsed="28.553977"/>
</suite>
<suite id="s1-s8" name="9145" source="/w/workspace/openflowplugin-csit-3node-clustering-only-vanadium/test/csit/suites/openflowplugin/Bug_Validation/9145.robot">
<kw name="Initialization Phase" type="SETUP">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-11T01:11:00.598763" level="INFO">Creating Session using : alias=session, url=http://:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x79045ce38450&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>session</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-11T01:11:00.598493" elapsed="0.000474"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.603034" 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-11T01:11:00.599567" elapsed="0.003495"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-11T01:11:00.603258" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:00.603146" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:00.603122" elapsed="0.000204"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.603812" 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-11T01:11:00.603488" elapsed="0.000367"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.604319" 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-11T01:11:00.604009" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:00.604848" elapsed="0.000274"/>
</kw>
<msg time="2026-04-11T01:11:00.605221" level="INFO">${status} = PASS</msg>
<msg time="2026-04-11T01:11:00.605268" 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-11T01:11:00.604519" elapsed="0.000772"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.605860" 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-11T01:11:00.605494" elapsed="0.000438"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.606888" 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-11T01:11:00.606627" elapsed="0.000287"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.607309" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-11T01:11:00.607055" elapsed="0.000281"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.607792" 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-11T01:11:00.607502" elapsed="0.000317"/>
</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-11T01:11:00.610138" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:11:00.609957" elapsed="0.000253"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.607874" elapsed="0.002364"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.610775" 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-11T01:11:00.610406" elapsed="0.000413"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.611338" 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-11T01:11:00.610978" elapsed="0.000418"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.611907" 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-11T01:11:00.611557" elapsed="0.000392"/>
</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-11T01:11:00.606172" elapsed="0.005835"/>
</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-11T01:11:00.599256" elapsed="0.012806"/>
</kw>
<doc>Create controller session and set variables.</doc>
<status status="PASS" start="2026-04-11T01:11:00.598239" elapsed="0.013869"/>
</kw>
<test id="s1-s8-t1" name="Start Mininet Multiple Connections" line="15">
<kw name="List_All_Indices" owner="ClusterManagement">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.615840" 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-11T01:11:00.615464" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.616302" 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-11T01:11:00.616020" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:00.616372" elapsed="0.000047"/>
</return>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:00.613295" elapsed="0.003222"/>
</kw>
<msg time="2026-04-11T01:11:00.616555" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>List_Indices_Or_All</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T01:11:00.612933" elapsed="0.003669"/>
</kw>
<msg time="2026-04-11T01:11:00.616698" level="INFO">${cluster_index_list} = []</msg>
<var>${cluster_index_list}</var>
<doc>Create a new list of all indices.</doc>
<status status="PASS" start="2026-04-11T01:11:00.612670" elapsed="0.004052"/>
</kw>
<kw name="Start Mininet Multiple Controllers" owner="MininetKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.623791" 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-11T01:11:00.623424" elapsed="0.000394"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.624251" 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-11T01:11:00.623969" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:00.624321" elapsed="0.000028"/>
</return>
<msg time="2026-04-11T01:11:00.624489" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:00.623046" elapsed="0.001469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.624899" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:00.624690" elapsed="0.000252"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.627320" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:11:00.627025" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:00.627006" elapsed="0.000411"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-11T01:11:00.627694" level="INFO">index=9
host=
alias=None
port=22
timeout=3 seconds
newline=

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-11T01:11:00.627798" level="INFO">${current_ssh_connection} = index=9
host=
alias=None
port=22
timeout=3 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-11T01:11:00.627560" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.628338" level="INFO">Attempting to execute command "sudo mn -c" on remote system "" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:00.627966" elapsed="0.000431"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-11T01:11:00.628924" level="INFO">${conn_id} = 10</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-11T01:11:00.628549" elapsed="0.000401"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.630120" level="INFO">Length is 0.</msg>
<msg time="2026-04-11T01:11:00.630199" 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-11T01:11:00.629579" elapsed="0.000644"/>
</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-11T01:11:00.630378" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-11T01:11:00.631558" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-11T01:11:00.631869" 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-11T01:11:00.631228" elapsed="0.001101">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-11T01:11:00.632402" 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-11T01:11:00.630879" elapsed="0.001574"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.629158" elapsed="0.003404">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.632730" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.632896" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.633066" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.633190" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:00.633151" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:11:00.633132" elapsed="0.000121"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.633368" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:00.633304" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:11:00.633289" elapsed="0.000157"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.633477" elapsed="0.000014"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-11T01:11:00.636452" elapsed="0.000148"/>
</kw>
<msg time="2026-04-11T01:11:00.636641" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-11T01:11:00.635943" elapsed="0.000759"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.636850" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.637004" elapsed="0.000019"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-11T01:11:00.633785" elapsed="0.003297"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.626510" elapsed="0.010645">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-11T01:11:00.637208" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.625970" elapsed="0.011283"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.625498" elapsed="0.011935">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.637612" elapsed="0.000023"/>
</kw>
<arg>${mininet}</arg>
<status status="FAIL" start="2026-04-11T01:11:00.625132" elapsed="0.012589">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.641590" elapsed="0.000025"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.641794" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.642031" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:11:00.641879" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:11:00.641862" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="'${protocol}' == 'ssl'">
<kw name="Install Certificates In Mininet" owner="MininetKeywords">
<doc>Copy and install certificates in simulator.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.642354" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-11T01:11:00.642155" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-04-11T01:11:00.642141" elapsed="0.000304"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>Start mininet ${options}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.642589" elapsed="0.000020"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>sudo mn ${options}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.642745" elapsed="0.000019"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.642900" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Create controller configuration</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.643068" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${controller_opt}</var>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.643241" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<var>${controller_opt}</var>
<arg>${controller_opt}</arg>
<arg>${SPACE}${protocol}:${ODL_SYSTEM_${index}_IP}:${ofport}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.643514" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${controller_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.643690" elapsed="0.000019"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-11T01:11:00.643364" elapsed="0.000375"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.643306" elapsed="0.000458"/>
</for>
<kw name="Log" owner="BuiltIn">
<arg>Open extra SSH connection to configure the OVS bridges</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.643911" elapsed="0.000020"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.647807" elapsed="0.000026"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${num_bridges}</var>
<arg>sudo ovs-vsctl show | grep Bridge | wc -l</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.647985" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${num_bridges}</var>
<arg>${num_bridges}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.648166" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${bridges}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.648338" elapsed="0.000019"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<var>${bridge}</var>
<arg>sudo ovs-vsctl show | grep Bridge | cut -c 12- | sort | head -${i} | tail -1</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.648601" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo ovs-vsctl del-controller ${bridge} &amp;&amp; sudo ovs-vsctl set bridge ${bridge} protocols=OpenFlow${ofversion}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.648760" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${bridges}</arg>
<arg>${bridge}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.648912" elapsed="0.000019"/>
</kw>
<var name="${i}"/>
<status status="NOT RUN" start="2026-04-11T01:11:00.648476" elapsed="0.000488"/>
</iter>
<var>${i}</var>
<value>1</value>
<value>${num_bridges+1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.648414" elapsed="0.000575"/>
</for>
<kw name="Log" owner="BuiltIn">
<arg>Configure OVS controllers ${controller_opt} in all bridges</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.649141" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sudo ovs-vsctl set-controller ${bridge} ${controller_opt}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.649412" elapsed="0.000022"/>
</kw>
<var name="${bridge}"/>
<status status="NOT RUN" start="2026-04-11T01:11:00.649250" elapsed="0.000217"/>
</iter>
<var>${bridge}</var>
<value>@{bridges}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.649204" elapsed="0.000287"/>
</for>
<kw name="Log" owner="BuiltIn">
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.649638" elapsed="0.000019"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${output}</var>
<arg>sudo ovs-vsctl show</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.649796" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.649967" elapsed="0.000052"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.650157" elapsed="0.000020"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.650213" elapsed="0.000015"/>
</return>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${cluster_index_list}</arg>
<doc>Start Mininet with custom topology and connect to list of controllers in ${controller_index_list} or all if no list is provided.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.620785" elapsed="0.029525">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${cluster_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.650506" elapsed="0.000022"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.650673" elapsed="0.000020"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10s</arg>
<arg>1s</arg>
<arg>OVSDB.Check OVS OpenFlow Connections</arg>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>3</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.650836" elapsed="0.000019"/>
</kw>
<doc>Start mininet linear with connection to all cluster instances.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.612159" elapsed="0.038833">OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t2" name="Check Entity Owner Status And Find Owner and Successor" line="25">
<kw name="Get OpenFlow Entity Owner Status For One Device" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.685222" 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-11T01:11:00.684845" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.685733" 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-11T01:11:00.685443" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:00.685804" elapsed="0.000029"/>
</return>
<msg time="2026-04-11T01:11:00.685955" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:00.684484" elapsed="0.001495"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:00.690469" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:00.690265" elapsed="0.000230"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:00.690641" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:00.691184" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:00.690979" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.691631" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:00.691371" elapsed="0.000301"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:00.691812" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:00.692337" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:00.692134" elapsed="0.000227"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.692784" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:00.692538" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.693313" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:00.692970" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.693788" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:00.693547" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.694267" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:00.693980" elapsed="0.000313"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:00.700690" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:00.709165" elapsed="0.000250"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.709953" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:00.709568" elapsed="0.000411"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:00.711149" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.710627" elapsed="0.000667">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.711473" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.710199" elapsed="0.001389">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.711757" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.711925" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.712095" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.712258" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.712434" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.712595" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.712753" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.712917" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.713071" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.713321" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.713571" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.713758" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:00.713199" elapsed="0.000640"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.713135" elapsed="0.000731"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.714001" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.714060" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.708685" elapsed="0.005480">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.714233" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.698528" elapsed="0.015803">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.714517" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.718608" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.718797" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.718900" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.689736" elapsed="0.029273">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:00.719121" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:00.719165" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:00.689165" elapsed="0.030023"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.719437" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:00.719272" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:00.719253" elapsed="0.000253"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:00.720782" elapsed="0.000204"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.721471" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:00.721133" elapsed="0.000364"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:00.722262" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.722001" elapsed="0.000346">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.722426" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.721672" elapsed="0.000859">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.722697" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.722864" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.723033" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.723195" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.723353" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.723533" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.723691" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.723854" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.724011" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.724257" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.724436" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.724593" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:00.724136" elapsed="0.000509"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.724074" elapsed="0.000597"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.724803" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.724861" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.720235" elapsed="0.004729">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:00.725074" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:00.725155" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:00.719652" elapsed="0.005528"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:00.725996" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.725677" elapsed="0.000380">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:00.725262" elapsed="0.000858">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:00.725243" elapsed="0.000910">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.726199" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.688632" elapsed="0.037663">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.726479" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.726642" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.726705" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:00.686265" elapsed="0.040537">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.726963" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.727144" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.727309" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.727481" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.727645" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:00.727801" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:00.727861" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.683839" elapsed="0.044119">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:01.762565" 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-11T01:11:01.762074" elapsed="0.000526"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:01.763150" 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-11T01:11:01.762848" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:01.763227" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T01:11:01.763417" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:01.761664" elapsed="0.001779"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:01.768303" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:01.768110" elapsed="0.000220"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:01.768492" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:01.769047" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:01.768840" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:01.769530" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:01.769257" elapsed="0.000315"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:01.769712" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:01.770258" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:01.770053" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:01.770702" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:01.770460" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:01.771228" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:01.770888" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:01.771668" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:01.771430" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:01.772138" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:01.771857" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:01.778682" elapsed="0.000217"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:01.787211" elapsed="0.000234"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:01.787997" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:01.787599" elapsed="0.000424"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:01.789155" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:01.788623" elapsed="0.000688">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:01.789490" elapsed="0.000022"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:01.788205" elapsed="0.001412">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.789824" elapsed="0.000026"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.790004" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.790176" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.790341" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.790521" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.790684" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.790843" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.791006" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.791161" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.791457" elapsed="0.000072"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.791733" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.791922" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:01.791311" elapsed="0.000693"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:01.791235" elapsed="0.000799"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.792173" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:01.792232" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:01.786719" elapsed="0.005621">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:01.792426" elapsed="0.000018"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:01.776468" elapsed="0.016064">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.792701" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.796955" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.797150" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:01.797216" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:01.767576" elapsed="0.029749">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:01.797511" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:01.797556" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:01.766966" elapsed="0.030615"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:01.797879" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:01.797682" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:01.797653" elapsed="0.000295"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:01.799301" elapsed="0.000254"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:01.800020" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:01.799707" elapsed="0.000343"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:01.800837" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:01.800574" elapsed="0.000353">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:01.800988" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:01.800227" elapsed="0.000863">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.801255" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.801485" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.801661" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.801838" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.802000" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.802158" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.802315" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.802492" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.802650" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.802900" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.803064" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.803218" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:01.802780" elapsed="0.000491"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:01.802715" elapsed="0.000583"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.803447" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:01.803508" elapsed="0.000169"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:01.798719" elapsed="0.005051">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:01.803883" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:01.803927" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:01.798097" elapsed="0.005852"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:01.804578" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:01.804242" elapsed="0.000397">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:01.804032" elapsed="0.000670">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:01.804014" elapsed="0.000720">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:01.804780" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:01.766260" elapsed="0.038618">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.805049" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.805208" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:01.805268" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:01.763830" elapsed="0.041536">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.805586" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.805761" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.805961" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.806118" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.806281" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:01.806456" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:01.806520" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:01.760870" elapsed="0.045751">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:02.837662" 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-11T01:11:02.837178" elapsed="0.000519"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:02.838162" 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-11T01:11:02.837864" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:02.838266" elapsed="0.000043"/>
</return>
<msg time="2026-04-11T01:11:02.838457" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:02.836791" elapsed="0.001691"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:02.843110" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:02.842919" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:02.843283" elapsed="0.000213"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:02.843851" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:02.843646" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:02.844307" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:02.844054" elapsed="0.000294"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:02.844507" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:02.845035" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:02.844832" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:02.845476" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:02.845220" elapsed="0.000297"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:02.845999" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:02.845662" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:02.846654" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:02.846184" elapsed="0.000515"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:02.847130" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:02.846845" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:02.853444" elapsed="0.000277"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:02.862124" elapsed="0.000234"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:02.862897" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:02.862525" elapsed="0.000398"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:02.864039" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:02.863508" elapsed="0.000686">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:02.864357" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:02.863103" elapsed="0.001390">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.864662" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.864830" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.864998" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.865158" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.865324" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.865498" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.865656" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.865817" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.865971" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.866275" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.866519" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.866711" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:02.866115" elapsed="0.000676"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:02.866042" elapsed="0.000778"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.866957" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:02.867016" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:02.861640" elapsed="0.005483">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:02.867191" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:02.851265" elapsed="0.016025">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.867474" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.871554" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.871778" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:02.871845" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:02.842359" elapsed="0.029592">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:02.872062" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:02.872105" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:02.841789" elapsed="0.030339"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:02.872333" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:02.872216" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:02.872195" elapsed="0.000257"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:02.873732" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:02.874426" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:02.874087" elapsed="0.000366"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:02.875217" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:02.874957" elapsed="0.000352">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:02.875371" elapsed="0.000032"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:02.874631" elapsed="0.000860">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.875656" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.875819" elapsed="0.000019"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.875984" elapsed="0.000159"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.876295" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.876478" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.876640" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.876798" elapsed="0.000025"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.876967" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.877123" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.877369" elapsed="0.000035"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.877551" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.877705" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:02.877249" elapsed="0.000507"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:02.877185" elapsed="0.000597"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.877914" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:02.877972" elapsed="0.000048"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:02.873186" elapsed="0.004927">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:02.878243" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:02.878289" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:02.872600" elapsed="0.005711"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:02.878933" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:02.878613" elapsed="0.000380">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:02.878407" elapsed="0.000648">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:02.878374" elapsed="0.000713">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:02.879133" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:02.841223" elapsed="0.038006">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.879412" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.879574" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:02.879635" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:02.838773" elapsed="0.040960">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.879894" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.880063" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.880223" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.880376" elapsed="0.000034"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.880553" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:02.880708" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:02.880769" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:02.835988" elapsed="0.044877">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:03.911299" 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-11T01:11:03.910824" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:03.911898" 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-11T01:11:03.911591" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:03.911974" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T01:11:03.912145" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:03.910415" elapsed="0.001755"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:03.916785" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:03.916569" elapsed="0.000245"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:03.916964" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:03.917536" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:03.917309" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:03.918050" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:03.917760" elapsed="0.000333"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:03.918236" elapsed="0.000198"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:03.920625" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:03.918582" elapsed="0.002071"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:03.921125" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:03.920824" elapsed="0.000357"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:03.921743" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:03.921335" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:03.922184" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:03.921938" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:03.922723" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:03.922378" elapsed="0.000373"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:03.929074" elapsed="0.000217"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:03.937582" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:03.938323" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:03.937947" elapsed="0.000403"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:03.939517" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:03.938966" elapsed="0.000707">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:03.939836" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:03.938559" elapsed="0.001396">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.940124" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.940291" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.940475" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.940640" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.940799" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.940955" elapsed="0.000057"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.941157" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.941322" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.941495" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.941761" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.941982" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.942169" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:03.941636" elapsed="0.000613"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:03.941565" elapsed="0.000713"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.942429" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:03.942489" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:03.937079" elapsed="0.005517">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:03.942717" elapsed="0.000018"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:03.926904" elapsed="0.015918">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.942995" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.947138" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.947326" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:03.947444" elapsed="0.000018"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:03.916019" elapsed="0.031534">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:03.947664" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:03.947710" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:03.915457" elapsed="0.032280"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:03.947940" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:03.947822" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:03.947802" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:03.949281" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:03.949972" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:03.949660" elapsed="0.000339"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:03.950812" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:03.950530" elapsed="0.000407">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:03.951000" elapsed="0.000164"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:03.950174" elapsed="0.001083">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.951453" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.951627" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.951798" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.951963" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.952126" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.952285" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.952459" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.952626" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.952784" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.953031" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.953196" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.953350" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:03.952909" elapsed="0.000508"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:03.952846" elapsed="0.000597"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.953577" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:03.953637" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:03.948748" elapsed="0.004992">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:03.953850" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:03.953893" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:03.948150" elapsed="0.005766"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:03.954532" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:03.954201" elapsed="0.000392">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:03.953995" elapsed="0.000689">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:03.953977" elapsed="0.000741">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:03.954768" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:03.914879" elapsed="0.039985">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.955033" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.955231" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:03.955295" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:03.912483" elapsed="0.042925">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.955574" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.955748" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.955913" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.956069" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.956228" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:03.956399" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:03.956463" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:03.909624" elapsed="0.046941">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:04.988539" 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-11T01:11:04.988012" elapsed="0.000562"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:04.989043" 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-11T01:11:04.988747" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:04.989117" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T01:11:04.989298" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:04.987621" elapsed="0.001704"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:04.993848" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:04.993660" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:04.994019" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:04.994575" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:04.994355" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:04.995099" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:04.994781" elapsed="0.000372"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:04.995296" elapsed="0.000201"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:04.995891" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:04.995675" elapsed="0.000243"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:04.996564" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:04.996081" elapsed="0.000525"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:04.997171" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:04.996752" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:04.997620" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:04.997363" elapsed="0.000302"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:04.998095" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:04.997811" elapsed="0.000311"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:05.004507" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:05.013202" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:05.013965" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:05.013581" elapsed="0.000410"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:05.015144" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:05.014583" elapsed="0.000716">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:05.015481" elapsed="0.000023"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:05.014172" elapsed="0.001437">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.015778" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.015946" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.016114" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.016276" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.016452" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.016613" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.016772" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.016934" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.017088" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.017353" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.017586" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.017771" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:05.017231" elapsed="0.000620"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:05.017158" elapsed="0.000722"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.018016" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:05.018075" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:05.012720" elapsed="0.005462">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:05.018251" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:05.002272" elapsed="0.016077">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.018581" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.022667" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.022855" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:05.022921" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:04.993118" elapsed="0.029909">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:05.023171" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:05.023215" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:04.992572" elapsed="0.030666"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:05.023501" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:05.023327" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:05.023305" elapsed="0.000266"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:05.024843" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:05.025518" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:05.025200" elapsed="0.000343"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:05.026305" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:05.026044" elapsed="0.000362">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:05.026470" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:05.025716" elapsed="0.000856">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.026743" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.026907" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.027087" elapsed="0.000174"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.027435" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.027600" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.027761" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.027920" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.028084" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.028240" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.028506" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.028673" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.028830" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:05.028368" elapsed="0.000551"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:05.028304" elapsed="0.000643"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.029083" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:05.029143" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:05.024299" elapsed="0.004947">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:05.029358" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:05.029418" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:05.023716" elapsed="0.005726"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:05.030057" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:05.029737" elapsed="0.000386">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:05.029531" elapsed="0.000653">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:05.029505" elapsed="0.000712">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:05.030262" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:04.992017" elapsed="0.038428">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.030621" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.030780" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:05.030841" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:04.989635" elapsed="0.041302">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.031124" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.031339" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.031564" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.031722" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.031882" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:05.032038" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:05.032099" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:04.986782" elapsed="0.045415">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:06.061822" 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-11T01:11:06.061334" elapsed="0.000521"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:06.062331" 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-11T01:11:06.062022" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:06.062426" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T01:11:06.062602" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:06.060938" elapsed="0.001690"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:06.067363" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:06.067155" elapsed="0.000257"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:06.067577" elapsed="0.000197"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:06.068136" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:06.067927" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:06.068636" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:06.068359" elapsed="0.000319"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:06.068820" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:06.069583" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:06.069148" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:06.070024" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:06.069776" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:06.070591" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:06.070214" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:06.071020" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:06.070781" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:06.071544" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:06.071209" elapsed="0.000364"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:06.077849" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:06.086378" elapsed="0.000237"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:06.087152" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:06.086767" elapsed="0.000412"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:06.088480" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:06.087914" elapsed="0.000760">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:06.088850" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:06.087359" elapsed="0.001616">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.089153" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.089323" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.089513" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.089688" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.089918" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.090078" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.090238" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.090418" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.090580" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.090861" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.091088" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.091278" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:06.090735" elapsed="0.000625"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:06.090658" elapsed="0.000749"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.091585" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:06.091655" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:06.085893" elapsed="0.005876">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:06.091838" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:06.075677" elapsed="0.016261">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.092108" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.096236" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.096479" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:06.096560" elapsed="0.000027"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:06.066497" elapsed="0.030256">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:06.096916" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:06.096977" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:06.065923" elapsed="0.031085"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:06.097288" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:06.097128" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:06.097099" elapsed="0.000303"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:06.099220" elapsed="0.000358"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:06.100299" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:06.099854" elapsed="0.000483"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:06.101445" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:06.101008" elapsed="0.000529">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:06.101603" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:06.100646" elapsed="0.001061">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.101886" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.102058" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.102228" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.102408" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.102573" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.102733" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.102900" elapsed="0.000023"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.103068" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.103226" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.103493" elapsed="0.000036"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.103679" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.103838" elapsed="0.000025"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:06.103353" elapsed="0.000544"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:06.103290" elapsed="0.000634"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.104060" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:06.104119" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:06.098458" elapsed="0.005762">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:06.104331" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:06.104375" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:06.097608" elapsed="0.006806"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:06.105045" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:06.104711" elapsed="0.000396">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:06.104496" elapsed="0.000673">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:06.104478" elapsed="0.000723">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:06.105247" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:06.065363" elapsed="0.039980">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.105576" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.105738" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:06.105799" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:06.062924" elapsed="0.042981">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.106072" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.106246" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.106427" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.106587" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.106745" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:06.106909" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:06.106974" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:06.060140" elapsed="0.046932">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:07.135596" 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-11T01:11:07.135087" elapsed="0.000545"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:07.136103" 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-11T01:11:07.135802" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:07.136183" elapsed="0.000066"/>
</return>
<msg time="2026-04-11T01:11:07.136386" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:07.134699" elapsed="0.001715"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:07.140945" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:07.140751" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:07.141117" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:07.141885" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:07.141473" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:07.142354" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:07.142097" elapsed="0.000302"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:07.142556" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:07.143083" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:07.142881" elapsed="0.000227"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:07.143596" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:07.143330" elapsed="0.000308"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:07.144123" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:07.143784" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:07.144590" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:07.144308" elapsed="0.000327"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:07.145062" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:07.144779" elapsed="0.000309"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:07.151318" elapsed="0.000230"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:07.159767" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:07.160522" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:07.160124" elapsed="0.000425"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:07.161691" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:07.161138" elapsed="0.000705">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:07.162005" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:07.160732" elapsed="0.001395">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.162296" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.162481" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.162651" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.162813" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.162970" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.163126" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.163283" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.163461" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.163619" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.163885" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.164106" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.164291" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:07.163762" elapsed="0.000609"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:07.163689" elapsed="0.000716"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.164559" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:07.164621" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:07.159272" elapsed="0.005455">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:07.164794" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:07.149175" elapsed="0.015756">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.165101" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.169338" elapsed="0.000058"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.169613" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:07.169681" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:07.140193" elapsed="0.029594">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:07.169897" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:07.169939" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:07.139652" elapsed="0.030310"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:07.170168" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:07.170048" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:07.170027" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:07.171520" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:07.172170" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:07.171872" elapsed="0.000323"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:07.172974" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:07.172714" elapsed="0.000346">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:07.173121" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:07.172367" elapsed="0.000857">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.173392" elapsed="0.000040"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.173598" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.173768" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.173931" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.174088" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.174244" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.174403" elapsed="0.000033"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.174590" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.174747" elapsed="0.000052"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.175035" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.175205" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.175361" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:07.174912" elapsed="0.000518"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:07.174847" elapsed="0.000611"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.175592" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:07.175651" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:07.170975" elapsed="0.004780">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:07.175863" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:07.175906" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:07.170377" elapsed="0.005551"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:07.176547" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:07.176214" elapsed="0.000399">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:07.176007" elapsed="0.000669">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:07.175989" elapsed="0.000719">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:07.176753" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:07.139096" elapsed="0.037753">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.177016" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.177174" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:07.177235" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:07.136722" elapsed="0.040609">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.177508" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.177705" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.177870" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.178024" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.178183" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:07.178339" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:07.178403" elapsed="0.000028"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:07.133882" elapsed="0.044666">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:08.210016" 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-11T01:11:08.209548" elapsed="0.000502"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:08.210541" 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-11T01:11:08.210213" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:08.210616" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T01:11:08.210788" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:08.209153" elapsed="0.001659"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:08.215528" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:08.215319" elapsed="0.000236"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:08.215701" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:08.216241" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:08.216037" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:08.216717" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:08.216462" elapsed="0.000296"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:08.216898" elapsed="0.000176"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:08.217435" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:08.217218" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:08.217861" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:08.217622" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:08.218386" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:08.218046" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:08.218837" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:08.218601" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:08.219302" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:08.219023" elapsed="0.000305"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:08.225730" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:08.234234" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:08.234980" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:08.234608" elapsed="0.000402"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:08.236142" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:08.235613" elapsed="0.000682">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:08.236474" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:08.235203" elapsed="0.001392">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.236761" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.236985" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.237154" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.237314" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.237490" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.237649" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.237805" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.237968" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.238120" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.238392" elapsed="0.000032"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.238624" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.238809" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:08.238265" elapsed="0.000623"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:08.238192" elapsed="0.000725"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.239054" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:08.239116" elapsed="0.000046"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:08.233757" elapsed="0.005506">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:08.239332" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:08.223570" elapsed="0.015878">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.239619" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.243707" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.243895" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:08.243961" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:08.214792" elapsed="0.029275">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:08.244177" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:08.244220" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:08.214187" elapsed="0.030056"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:08.244541" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:08.244367" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:08.244345" elapsed="0.000263"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:08.245891" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:08.246566" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:08.246244" elapsed="0.000351"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:08.247385" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:08.247095" elapsed="0.000396">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:08.247553" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:08.246767" elapsed="0.000890">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.247831" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.247996" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.248162" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.248323" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.248506" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.248669" elapsed="0.000024"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.248831" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.248992" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.249147" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.249558" elapsed="0.000025"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.249729" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.249883" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:08.249275" elapsed="0.000661"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:08.249211" elapsed="0.000751"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.250095" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:08.250154" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:08.245343" elapsed="0.004914">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:08.250366" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:08.250426" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:08.244753" elapsed="0.005698"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:08.251056" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:08.250740" elapsed="0.000376">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:08.250534" elapsed="0.000644">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:08.250515" elapsed="0.000729">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:08.251294" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:08.213649" elapsed="0.037746">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.251599" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.251760" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:08.251822" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:08.211099" elapsed="0.040819">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.252079" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.252251" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.252437" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.252595" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.252757" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:08.252915" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:08.252975" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:08.208370" elapsed="0.044704">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:09.284213" 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-11T01:11:09.283692" elapsed="0.000555"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:09.284744" 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-11T01:11:09.284439" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:09.284820" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T01:11:09.284991" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:09.283279" elapsed="0.001738"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:09.289602" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:09.289398" elapsed="0.000231"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:09.289775" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:09.290317" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:09.290113" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:09.290870" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:09.290615" elapsed="0.000297"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:09.291052" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:09.291604" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:09.291385" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:09.292038" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:09.291795" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:09.292780" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:09.292254" elapsed="0.000553"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:09.293211" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:09.292972" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:09.293698" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:09.293403" elapsed="0.000321"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:09.299930" elapsed="0.000209"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:09.308655" elapsed="0.000218"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:09.309398" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:09.309021" elapsed="0.000426"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:09.310564" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:09.310016" elapsed="0.000699">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:09.310876" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:09.309632" elapsed="0.001363">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.311164" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.311329" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.311658" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.311822" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.311979" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.312136" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.312296" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.312475" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.312632" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.312917" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.313134" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.313319" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:09.312791" elapsed="0.000611"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:09.312717" elapsed="0.000728"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.313583" elapsed="0.000058"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:09.313683" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:09.308127" elapsed="0.005665">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:09.313859" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:09.297775" elapsed="0.016181">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.314126" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.318213" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.318404" elapsed="0.000073"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:09.318524" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:09.288851" elapsed="0.029779">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:09.318740" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:09.318789" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:09.288281" elapsed="0.030531"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:09.319018" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:09.318900" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:09.318878" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:09.320349" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:09.321043" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:09.320717" elapsed="0.000351"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:09.321847" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:09.321586" elapsed="0.000347">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:09.321994" elapsed="0.001900"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:09.321240" elapsed="0.002750">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.324161" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.324328" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.324514" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.324679" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.324873" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.325058" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.325218" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.325379" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.325553" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.325804" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.325969" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.326123" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:09.325682" elapsed="0.000493"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:09.325618" elapsed="0.000583"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.326332" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:09.326393" elapsed="0.000027"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:09.319822" elapsed="0.006690">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:09.326623" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:09.326670" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:09.319225" elapsed="0.007467"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:09.327292" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:09.326978" elapsed="0.000374">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:09.326772" elapsed="0.000659">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:09.326753" elapsed="0.000712">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:09.327511" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:09.287718" elapsed="0.039888">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.327773" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.327930" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:09.327992" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:09.285307" elapsed="0.042780">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.328246" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.328434" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.328599" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.328798" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.328957" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:09.329128" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:09.329190" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:09.282494" elapsed="0.046791">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:10.358933" 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-11T01:11:10.358454" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:10.359455" 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-11T01:11:10.359136" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:10.359532" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:11:10.359703" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:10.358051" elapsed="0.001678"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:10.364265" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:10.364073" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:10.364456" elapsed="0.000196"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:10.365016" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:10.364806" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:10.365500" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:10.365225" elapsed="0.000318"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:10.365685" elapsed="0.000184"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:10.366259" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:10.366016" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:10.411421" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:10.366469" elapsed="0.045019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:10.412070" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:10.411694" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:10.412540" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:10.412278" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:10.413022" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:10.412733" elapsed="0.000315"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:10.419563" elapsed="0.000223"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:10.428360" elapsed="0.000233"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:10.429151" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:10.428747" elapsed="0.000431"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:10.430452" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:10.429881" elapsed="0.000731">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:10.430780" elapsed="0.000024"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:10.429474" elapsed="0.001435">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.431084" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.431255" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.431445" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.431632" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.431795" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.431956" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.432117" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.432282" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.432455" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.432727" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.432946" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.433133" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:10.432602" elapsed="0.000612"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:10.432527" elapsed="0.000717"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.433381" elapsed="0.000037"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:10.433466" elapsed="0.000022"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:10.427866" elapsed="0.005725">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:10.433662" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:10.417275" elapsed="0.016490">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.433936" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.438210" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.438470" elapsed="0.000025"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:10.438582" elapsed="0.000020"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:10.363538" elapsed="0.075165">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:10.438824" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:10.438869" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:10.362972" elapsed="0.075921"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:10.439124" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:10.438985" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:10.438963" elapsed="0.000230"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:10.440553" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:10.441212" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:10.440911" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:10.442029" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:10.441767" elapsed="0.000349">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:10.442178" elapsed="0.000016"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:10.441429" elapsed="0.000851">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.442470" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.442637" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.442803" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.442963" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.443218" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.443374" elapsed="0.000024"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.443550" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.443713" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.443921" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.444172" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.444335" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.444515" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:10.444050" elapsed="0.000519"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:10.443986" elapsed="0.000609"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.444728" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:10.444787" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:10.440003" elapsed="0.004890">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:10.445004" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:10.445089" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:10.439346" elapsed="0.005768"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:10.445786" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:10.445427" elapsed="0.000423">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:10.445198" elapsed="0.000747">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:10.445179" elapsed="0.000804">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:10.446033" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:10.362425" elapsed="0.083708">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.446305" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.446486" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:10.446550" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:10.360021" elapsed="0.086629">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.446812" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.446982" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.447144" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.447297" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.447474" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:10.447632" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:10.447693" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:10.357239" elapsed="0.090553">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:11.478065" 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-11T01:11:11.477605" elapsed="0.000493"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:11.478579" 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-11T01:11:11.478264" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:11.478657" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T01:11:11.478831" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:11.477185" elapsed="0.001671"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:11.483483" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:11.483277" elapsed="0.000234"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:11.483659" elapsed="0.000189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:11.484206" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:11.483998" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:11.484694" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:11.484432" elapsed="0.000304"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:11.484880" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:11.485431" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:11.485208" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:11.485876" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:11.485629" elapsed="0.000289"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:11.486421" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:11.486063" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:11.486848" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:11.486612" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:11.487315" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:11.487035" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:11.493740" elapsed="0.000217"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:11.502250" elapsed="0.000229"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:11.503007" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:11.502629" elapsed="0.000404"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:11.504153" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:11.503621" elapsed="0.000682">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:11.504482" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:11.503210" elapsed="0.001392">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.504772" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.504937" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.505104" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.505266" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.505443" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.505601" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.505763" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.505956" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.506115" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.506376" elapsed="0.000077"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.506660" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.506846" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:11.506254" elapsed="0.000672"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:11.506182" elapsed="0.000774"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.507091" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:11.507150" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:11.501741" elapsed="0.005516">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:11.507327" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:11.491560" elapsed="0.015886">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.507617" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.511689" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.511875" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:11.511940" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:11.482738" elapsed="0.029309">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:11.512159" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:11.512202" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:11.482170" elapsed="0.030056"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:11.512482" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:11.512312" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:11.512291" elapsed="0.000259"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:11.513835" elapsed="0.000248"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:11.514558" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:11.514236" elapsed="0.000348"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:11.515352" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:11.515090" elapsed="0.000366">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:11.515518" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:11.514760" elapsed="0.000861">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.515786" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.515984" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.516154" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.516317" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.516504" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.516667" elapsed="0.000022"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.516825" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.516987" elapsed="0.000154"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.517282" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.517557" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.517722" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.517876" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:11.517433" elapsed="0.000496"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:11.517347" elapsed="0.000608"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.518088" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:11.518161" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:11.513275" elapsed="0.004990">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:11.518375" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:11.518436" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:11.512693" elapsed="0.005767"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:11.519057" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:11.518743" elapsed="0.000374">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:11.518540" elapsed="0.000638">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:11.518522" elapsed="0.000688">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:11.519256" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:11.481625" elapsed="0.037727">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.519539" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.519700" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:11.519760" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:11.479219" elapsed="0.040638">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.520055" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.520228" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.520393" elapsed="0.000033"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.520565" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.520724" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:11.520881" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:11.520942" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:11.476424" elapsed="0.044615">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:12.552299" 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-11T01:11:12.551825" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:12.552814" 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-11T01:11:12.552519" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:12.552889" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T01:11:12.553077" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:12.551444" elapsed="0.001659"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:12.557657" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:12.557468" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:12.557829" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:12.558378" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:12.558170" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:12.558857" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:12.558603" elapsed="0.000295"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:12.559036" elapsed="0.000178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:12.559754" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:12.559356" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:12.560184" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:12.559942" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:12.560728" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:12.560370" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:12.561170" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:12.560914" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:12.561659" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:12.561357" elapsed="0.000335"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:12.567969" elapsed="0.000289"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:12.576519" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:12.577270" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:12.576886" elapsed="0.000410"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:12.578450" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:12.577897" elapsed="0.000714">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:12.578770" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:12.577512" elapsed="0.001377">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.579058" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.579225" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.579397" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.579577" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.579737" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.579896" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.580053" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.580214" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.580372" elapsed="0.000024"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.580658" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.580874" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.581058" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:12.580535" elapsed="0.000603"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:12.580461" elapsed="0.000706"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.581303" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:12.581361" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:12.576026" elapsed="0.005482">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:12.582110" elapsed="0.000033"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:12.565782" elapsed="0.016480">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.582468" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.586598" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.586838" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:12.586905" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:12.556890" elapsed="0.030120">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:12.587122" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:12.587165" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:12.556320" elapsed="0.030868"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:12.587419" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:12.587283" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:12.587262" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:12.588770" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:12.589444" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:12.589123" elapsed="0.000348"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:12.590442" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:12.590146" elapsed="0.000396">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:12.590605" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:12.589675" elapsed="0.001034">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.590875" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.591041" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.591208" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.591369" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.591548" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.591705" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.591859" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.592021" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.592174" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.592435" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.592602" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.592755" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:12.592298" elapsed="0.000508"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:12.592236" elapsed="0.000596"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.592962" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:12.593020" elapsed="0.000048"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:12.588214" elapsed="0.004946">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:12.593271" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:12.593314" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:12.587635" elapsed="0.005702"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:12.593982" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:12.593643" elapsed="0.000399">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:12.593434" elapsed="0.000671">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:12.593415" elapsed="0.000722">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:12.594182" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:12.555778" elapsed="0.038501">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.594466" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.594628" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:12.594689" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:12.553410" elapsed="0.041377">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.594947" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.595117" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.595277" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.595446" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.595610" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:12.595763" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:12.595823" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:12.550637" elapsed="0.045281">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:13.628750" 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-11T01:11:13.628257" elapsed="0.000528"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:13.629334" 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-11T01:11:13.629035" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:13.629429" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:11:13.629602" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:13.627872" elapsed="0.001755"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:13.634693" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:13.634496" elapsed="0.000226"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:13.634873" elapsed="0.000188"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:13.635431" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:13.635208" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:13.635900" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:13.635645" elapsed="0.000298"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:13.636084" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:13.636632" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:13.636425" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:13.637066" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:13.636818" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:13.637617" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:13.637254" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:13.638038" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:13.637802" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:13.638675" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:13.638252" elapsed="0.000454"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:13.645105" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:13.653506" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:13.654245" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:13.653864" elapsed="0.000406"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:13.655450" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:13.654903" elapsed="0.000709">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:13.655776" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:13.654477" elapsed="0.001419">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.656067" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.656234" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.656421" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.656588" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.656746" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.656903" elapsed="0.000059"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.657106" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.657270" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.657448" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.657859" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.658080" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.658265" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:13.657721" elapsed="0.000626"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:13.657525" elapsed="0.000851"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.658532" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:13.658621" elapsed="0.000020"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:13.653013" elapsed="0.005727">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:13.658808" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:13.642905" elapsed="0.016004">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.659077" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.663178" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.663365" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:13.663487" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:13.633921" elapsed="0.029674">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:13.663706" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:13.663749" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:13.633343" elapsed="0.030429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:13.663976" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:13.663857" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:13.663837" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:13.665328" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:13.666014" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:13.665705" elapsed="0.000335"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:13.666843" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:13.666561" elapsed="0.000408">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:13.667033" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:13.666214" elapsed="0.000925">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.667306" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.667501" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.667673" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.667838" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.667998" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.668155" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.668311" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.668492" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.668652" elapsed="0.000019"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.668900" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.669066" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.669221" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:13.668779" elapsed="0.000494"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:13.668715" elapsed="0.000584"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.669448" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:13.669510" elapsed="0.000014"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:13.664795" elapsed="0.004818">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:13.669722" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:13.669765" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:13.664194" elapsed="0.005593"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:13.670392" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:13.670074" elapsed="0.000394">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:13.669867" elapsed="0.000665">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:13.669849" elapsed="0.000715">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:13.670609" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:13.632790" elapsed="0.037915">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.670900" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.671102" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:13.671166" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:13.629924" elapsed="0.041341">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.671442" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.671615" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.671775" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.671928" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.672088" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:13.672244" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:13.672304" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:13.627083" elapsed="0.045334">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:14.702366" 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-11T01:11:14.701893" elapsed="0.000530"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:14.702887" 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-11T01:11:14.702590" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:14.702962" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T01:11:14.703131" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:14.701514" elapsed="0.001642"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:14.707674" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:14.707486" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:14.707845" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:14.708406" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:14.708183" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:14.708867" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:14.708616" elapsed="0.000293"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:14.709048" elapsed="0.000204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:14.709621" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:14.709415" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:14.710045" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:14.709805" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:14.710679" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:14.710229" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:14.711101" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:14.710866" elapsed="0.000278"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:14.711585" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:14.711286" elapsed="0.000325"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:14.717960" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:14.726473" elapsed="0.000267"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:14.727303" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:14.726919" elapsed="0.000411"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:14.728467" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:14.727921" elapsed="0.000700">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:14.728788" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:14.727536" elapsed="0.001370">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.729076" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.729241" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.729441" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.729607" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.729764" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.729921" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.730079" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.730241" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.730414" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.730681" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.730908" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.731095" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:14.730557" elapsed="0.000618"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:14.730486" elapsed="0.000718"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.731339" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:14.731416" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:14.725901" elapsed="0.005626">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:14.731596" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:14.715780" elapsed="0.015918">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.731910" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.736013" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.736200" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:14.736268" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:14.706940" elapsed="0.029435">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:14.736543" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:14.736588" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:14.706371" elapsed="0.030241"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:14.736812" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:14.736698" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:14.736677" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:14.738169" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:14.738857" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:14.738547" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:14.739673" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:14.739407" elapsed="0.000357">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:14.739829" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:14.739058" elapsed="0.000873">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.740100" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.740267" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.740462" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.740629" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.740790" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.740949" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.741109" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.741275" elapsed="0.000175"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.741630" elapsed="0.000022"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.741893" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.742061" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.742217" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:14.741769" elapsed="0.000535"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:14.741698" elapsed="0.000634"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.742486" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:14.742548" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:14.737634" elapsed="0.005018">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:14.742765" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:14.742810" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:14.737024" elapsed="0.005809"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:14.743458" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:14.743129" elapsed="0.000391">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:14.742921" elapsed="0.000663">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:14.742903" elapsed="0.000713">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:14.743662" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:14.705835" elapsed="0.037923">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.743929" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.744092" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:14.744154" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:14.703464" elapsed="0.040787">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.744429" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.744603" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.744769" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.744928" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.745090" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:14.745250" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:14.745313" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:14.700697" elapsed="0.044731">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:15.775092" 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-11T01:11:15.774633" elapsed="0.000493"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:15.775605" 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-11T01:11:15.775290" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:15.775682" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T01:11:15.775852" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:15.774231" elapsed="0.001646"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:15.780416" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:15.780214" elapsed="0.000230"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:15.780592" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:15.781139" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:15.780932" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:15.781618" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:15.781346" elapsed="0.000315"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:15.781804" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:15.784091" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:15.782131" elapsed="0.001988"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:15.784560" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:15.784287" elapsed="0.000316"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:15.785103" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:15.784752" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:15.785554" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:15.785294" elapsed="0.000305"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:15.786034" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:15.785745" elapsed="0.000316"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:15.792332" elapsed="0.000230"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:15.800839" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:15.801617" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:15.801203" elapsed="0.000440"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:15.802787" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:15.802203" elapsed="0.000734">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:15.803099" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:15.801821" elapsed="0.001396">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.803389" elapsed="0.000038"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.803574" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.803745" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.803914" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.804138" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.804298" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.804478" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.804657" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.804817" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.805080" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.805299" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.805502" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:15.804956" elapsed="0.000630"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:15.804886" elapsed="0.000728"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.805751" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:15.805810" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:15.800339" elapsed="0.005579">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:15.805988" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:15.790155" elapsed="0.015933">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.806258" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.810351" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.810583" elapsed="0.000025"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:15.810656" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:15.779683" elapsed="0.031078">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:15.810876" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:15.810921" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:15.779122" elapsed="0.031822"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:15.811143" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:15.811029" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:15.811009" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:15.812526" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:15.813227" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:15.812919" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:15.814037" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:15.813775" elapsed="0.000348">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:15.814185" elapsed="0.000159"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:15.813445" elapsed="0.001008">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.814652" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.814820" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.814991" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.815155" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.815316" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.815508" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.815670" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.815834" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.815990" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.816239" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.816421" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.816578" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:15.816117" elapsed="0.000514"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:15.816053" elapsed="0.000616"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.816807" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:15.816869" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:15.811974" elapsed="0.004998">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:15.817081" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:15.817124" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:15.811352" elapsed="0.005794"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:15.817761" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:15.817447" elapsed="0.000374">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:15.817226" elapsed="0.000656">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:15.817207" elapsed="0.000706">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:15.817958" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:15.778579" elapsed="0.039474">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.818258" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.818436" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:15.818499" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:15.776171" elapsed="0.042429">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.818784" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.818963" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.819130" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.819286" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.819462" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:15.819620" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:15.819681" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:15.773439" elapsed="0.046340">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:16.854404" 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-11T01:11:16.853891" elapsed="0.000552"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:16.854915" 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-11T01:11:16.854617" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:16.854993" elapsed="0.000047"/>
</return>
<msg time="2026-04-11T01:11:16.855175" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:16.853449" elapsed="0.001751"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:16.859822" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:16.859608" elapsed="0.000242"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:16.859996" elapsed="0.000194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:16.860567" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:16.860339" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:16.861033" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:16.860778" elapsed="0.000297"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:16.861215" elapsed="0.000199"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:16.861819" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:16.861561" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:16.862584" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:16.862109" elapsed="0.000519"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:16.863127" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:16.862779" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:16.863573" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:16.863315" elapsed="0.000302"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:16.864048" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:16.863762" elapsed="0.000313"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:16.870460" elapsed="0.000214"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:16.878935" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:16.879711" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:16.879305" elapsed="0.000432"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:16.880857" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:16.880301" elapsed="0.000712">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:16.881174" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:16.879918" elapsed="0.001376">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.881482" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.881651" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.881818" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.881997" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.882154" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.882311" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.882494" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.882659" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.882814" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.883079" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.883295" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.883501" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:16.882956" elapsed="0.000628"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:16.882883" elapsed="0.000731"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.883751" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:16.883811" elapsed="0.000018"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:16.878451" elapsed="0.005471">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:16.883990" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:16.868194" elapsed="0.015937">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.884303" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.888432" elapsed="0.000037"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.888633" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:16.888699" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:16.859059" elapsed="0.029746">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:16.888917" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:16.888960" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:16.858509" elapsed="0.030474"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:16.889191" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:16.889071" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:16.889049" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:16.890608" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:16.891270" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:16.890966" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:16.892083" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:16.891820" elapsed="0.000349">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:16.892230" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:16.891488" elapsed="0.000845">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.892515" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.892680" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.892847" elapsed="0.000173"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.893171" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.893331" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.893514" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.893676" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.893840" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.894028" elapsed="0.000066"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.894332" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.894514" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.894670" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:16.894208" elapsed="0.000515"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:16.894143" elapsed="0.000606"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.894887" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:16.894947" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:16.890056" elapsed="0.004996">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:16.895164" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:16.895208" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:16.889442" elapsed="0.005788"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:16.895860" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:16.895544" elapsed="0.000376">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:16.895310" elapsed="0.000673">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:16.895292" elapsed="0.000722">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:16.896059" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:16.857946" elapsed="0.038210">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.896325" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.896504" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:16.896567" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:16.855510" elapsed="0.041155">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.896826" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.896996" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.897158" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.897313" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.897490" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:16.897649" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:16.897708" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:16.852619" elapsed="0.045223">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:17.928023" 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-11T01:11:17.927548" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:17.928542" 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-11T01:11:17.928225" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:17.928618" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T01:11:17.928790" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:17.927128" elapsed="0.001687"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:17.933354" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:17.933165" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:17.933545" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:17.934094" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:17.933887" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:17.934580" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:17.934300" elapsed="0.000322"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:17.934768" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:17.935510" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:17.935097" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:17.935981" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:17.935725" elapsed="0.000297"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:17.936528" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:17.936170" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:17.936951" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:17.936715" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:17.937435" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:17.937138" elapsed="0.000323"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:17.943794" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:17.952229" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:17.952994" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:17.952605" elapsed="0.000415"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:17.954138" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:17.953612" elapsed="0.000675">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:17.954467" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:17.953198" elapsed="0.001389">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.954757" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.954987" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.955158" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.955323" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.955505" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.955667" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.955855" elapsed="0.000027"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.956029" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.956187" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.956466" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.956692" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.956879" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:17.956326" elapsed="0.000633"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:17.956256" elapsed="0.000732"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.957125" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:17.957184" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:17.951725" elapsed="0.005568">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:17.957362" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:17.941604" elapsed="0.015878">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.957653" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.961736" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.961923" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:17.961989" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:17.932634" elapsed="0.029461">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:17.962205" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:17.962247" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:17.932053" elapsed="0.030216"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:17.962563" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:17.962444" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:17.962370" elapsed="0.000260"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:17.963917" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:17.964595" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:17.964271" elapsed="0.000350"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:17.965552" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:17.965128" elapsed="0.000511">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:17.965701" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:17.964795" elapsed="0.001009">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.965970" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.966137" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.966304" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.966493" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.966654" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.966809" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.966966" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.967126" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.967280" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.967547" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.967712" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.967865" elapsed="0.000043"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:17.967424" elapsed="0.000522"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:17.967344" elapsed="0.000627"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.968106" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:17.968164" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:17.963356" elapsed="0.004912">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:17.968378" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:17.968440" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:17.962778" elapsed="0.005685"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:17.969056" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:17.968747" elapsed="0.000368">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:17.968544" elapsed="0.000633">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:17.968526" elapsed="0.000717">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:17.969292" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:17.931499" elapsed="0.037907">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.969580" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.969738" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:17.969800" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:17.929108" elapsed="0.040789">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.970056" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.970225" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.970402" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.970562" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.970721" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:17.970877" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:17.970937" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:17.926328" elapsed="0.044706">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:19.001251" 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-11T01:11:19.000786" elapsed="0.000499"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:19.001764" 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-11T01:11:19.001468" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:19.001838" elapsed="0.000042"/>
</return>
<msg time="2026-04-11T01:11:19.002007" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:19.000383" elapsed="0.001649"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:19.006746" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:19.006554" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:19.006919" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:19.007692" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:19.007259" elapsed="0.000550"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:19.008258" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:19.008000" elapsed="0.000316"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:19.008476" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:19.009011" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:19.008804" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:19.009479" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:19.009198" elapsed="0.000323"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:19.010009" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:19.009669" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:19.010445" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:19.010195" elapsed="0.000303"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:19.011058" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:19.010709" elapsed="0.000377"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:19.017319" elapsed="0.000238"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:19.025806" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:19.026579" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:19.026166" elapsed="0.000440"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:19.027728" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:19.027175" elapsed="0.000708">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:19.028048" elapsed="0.000023"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:19.026785" elapsed="0.001390">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.028344" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.028559" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.028733" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.028897" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.029056" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.029214" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.029383" elapsed="0.000033"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.029562" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.029718" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.029988" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.030205" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.030404" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:19.029864" elapsed="0.000623"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:19.029790" elapsed="0.000727"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.030653" elapsed="0.000062"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:19.030757" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:19.025309" elapsed="0.005558">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:19.030941" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:19.015142" elapsed="0.015898">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.031208" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.035440" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.035631" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:19.035697" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:19.005990" elapsed="0.029812">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:19.035918" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:19.035961" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:19.005444" elapsed="0.030541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:19.036203" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:19.036072" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:19.036051" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:19.037594" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:19.038254" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:19.037948" elapsed="0.000333"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:19.039062" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:19.038801" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:19.039212" elapsed="0.000018"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:19.038473" elapsed="0.000841">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.039505" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.039672" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.039837" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.039998" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.040194" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.040354" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.040532" elapsed="0.000035"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.040714" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.040870" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.041120" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.041285" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.041456" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:19.040999" elapsed="0.000511"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:19.040934" elapsed="0.000602"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.041670" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:19.041727" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:19.037044" elapsed="0.004787">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:19.041946" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:19.041989" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:19.036430" elapsed="0.005581"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:19.042635" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:19.042298" elapsed="0.000407">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:19.042091" elapsed="0.000692">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:19.042073" elapsed="0.000754">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:19.042888" elapsed="0.000021"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:19.004890" elapsed="0.038117">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.043180" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.043341" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:19.043421" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:19.002450" elapsed="0.041071">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.043683" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.043853" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.044015" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.044207" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.044370" elapsed="0.000035"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:19.044547" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:19.044632" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:18.999559" elapsed="0.045177">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:20.070290" 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-11T01:11:20.069792" elapsed="0.000535"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:20.070809" 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-11T01:11:20.070516" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:20.070884" elapsed="0.000039"/>
</return>
<msg time="2026-04-11T01:11:20.071054" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:20.069412" elapsed="0.001667"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:20.075616" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:20.075424" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:20.075791" elapsed="0.000225"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:20.076377" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:20.076168" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:20.076858" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:20.076602" elapsed="0.000304"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:20.077047" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:20.077603" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:20.077374" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:20.078036" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:20.077791" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:20.078579" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:20.078222" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:20.079000" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:20.078765" elapsed="0.000278"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:20.079499" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:20.079187" elapsed="0.000338"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:20.085902" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:20.094337" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:20.095118" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:20.094709" elapsed="0.000435"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:20.096373" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:20.095831" elapsed="0.000729">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:20.096721" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:20.095435" elapsed="0.001406">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.097010" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.097175" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.097343" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.097528" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.097688" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.097846" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.098002" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.098163" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.098318" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.098612" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.098828" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.099030" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:20.098487" elapsed="0.000623"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:20.098413" elapsed="0.000726"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.099275" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:20.099333" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:20.093859" elapsed="0.005604">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:20.099533" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:20.083712" elapsed="0.015921">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.099805" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.103955" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.104161" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:20.104269" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:20.074871" elapsed="0.029507">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:20.104505" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:20.104549" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:20.074299" elapsed="0.030273"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:20.104773" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:20.104658" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:20.104638" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:20.106123" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:20.106795" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:20.106494" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:20.107603" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:20.107321" elapsed="0.000367">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:20.107749" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:20.106993" elapsed="0.000857">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.108012" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.108202" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.108372" elapsed="0.000037"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.108555" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.108714" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.108868" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.109025" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.109186" elapsed="0.000154"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.109502" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.109755" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.109920" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.110076" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:20.109632" elapsed="0.000496"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:20.109568" elapsed="0.000585"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.110285" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:20.110343" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:20.105588" elapsed="0.004877">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:20.110576" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:20.110655" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:20.104984" elapsed="0.005696"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:20.111283" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:20.110968" elapsed="0.000375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:20.110761" elapsed="0.000660">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:20.110742" elapsed="0.000713">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:20.111501" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:20.073757" elapsed="0.037840">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.111768" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.111927" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:20.111988" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:20.071370" elapsed="0.040714">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.112259" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.112452" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.112617" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.112772" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.112934" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:20.113090" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:20.113152" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:20.068593" elapsed="0.044657">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:21.143718" 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-11T01:11:21.143178" elapsed="0.000579"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:21.144234" 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-11T01:11:21.143933" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:21.144311" elapsed="0.000053"/>
</return>
<msg time="2026-04-11T01:11:21.144521" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:21.142781" elapsed="0.001765"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:21.149199" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:21.149005" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:21.149372" elapsed="0.000218"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:21.149948" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:21.149741" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:21.150435" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:21.150163" elapsed="0.000316"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:21.150641" elapsed="0.000183"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:21.151376" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:21.150969" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:21.151828" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:21.151585" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:21.152355" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:21.152015" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:21.152793" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:21.152557" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:21.153259" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:21.152978" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:21.159557" elapsed="0.000210"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:21.168035" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:21.168800" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:21.168411" elapsed="0.000415"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:21.169968" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:21.169429" elapsed="0.000704">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:21.170292" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:21.169006" elapsed="0.001427">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.170603" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.170788" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.170958" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.171120" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.171278" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.171455" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.171615" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.171778" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.171934" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.172209" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.172484" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.172674" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:21.172086" elapsed="0.000669"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:21.172008" elapsed="0.000777"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.172924" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:21.172983" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:21.167561" elapsed="0.005529">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:21.173157" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:21.157356" elapsed="0.015900">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.173441" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.177578" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.177766" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:21.177831" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:21.148469" elapsed="0.029473">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:21.178055" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:21.178098" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:21.147894" elapsed="0.030226"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:21.178324" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:21.178208" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:21.178187" elapsed="0.000259"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:21.179737" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:21.180406" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:21.180091" elapsed="0.000343"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:21.183495" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:21.183209" elapsed="0.000374">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:21.183646" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:21.180609" elapsed="0.003141">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.183921" elapsed="0.000024"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.184124" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.184293" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.184473" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.184636" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.184792" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.184952" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.185114" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.185271" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.185536" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.185701" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.185854" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:21.185413" elapsed="0.000493"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:21.185335" elapsed="0.000596"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.186062" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:21.186121" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:21.179190" elapsed="0.007034">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:21.186334" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:21.186377" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:21.178597" elapsed="0.007819"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:21.187040" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:21.186706" elapsed="0.000394">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:21.186497" elapsed="0.000665">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:21.186479" elapsed="0.000715">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:21.187239" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:21.147334" elapsed="0.040001">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.187521" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.187685" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:21.187747" elapsed="0.000014"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:21.144942" elapsed="0.042902">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.188041" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.188211" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.188373" elapsed="0.000036"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.188548" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.188710" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:21.188867" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:21.188928" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:21.141893" elapsed="0.047131">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:22.217892" 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-11T01:11:22.217387" elapsed="0.000541"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:22.218415" 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-11T01:11:22.218099" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:22.218494" elapsed="0.000051"/>
</return>
<msg time="2026-04-11T01:11:22.218678" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:22.216996" elapsed="0.001706"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:22.223216" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:22.223025" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:22.223409" elapsed="0.000200"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:22.223965" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:22.223758" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:22.224708" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:22.224180" elapsed="0.000572"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:22.224897" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:22.225452" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:22.225227" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:22.225887" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:22.225643" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:22.226435" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:22.226077" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:22.226860" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:22.226625" elapsed="0.000278"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:22.227328" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:22.227048" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:22.233600" elapsed="0.000299"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:22.242192" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:22.242953" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:22.242572" elapsed="0.000408"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:22.244108" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:22.243574" elapsed="0.000691">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:22.244448" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:22.243160" elapsed="0.001409">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.244753" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.244919" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.245085" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.245247" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.245423" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.245585" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.245744" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.245907" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.246064" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.246335" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.246573" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.246760" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:22.246211" elapsed="0.000629"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:22.246137" elapsed="0.000732"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.247004" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:22.247063" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:22.241711" elapsed="0.005460">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:22.247240" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:22.231428" elapsed="0.015912">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.247527" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.251666" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.251890" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:22.251957" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:22.222497" elapsed="0.029566">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:22.252176" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:22.252219" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:22.221933" elapsed="0.030309"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:22.252466" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:22.252329" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:22.252308" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:22.253827" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:22.254518" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:22.254186" elapsed="0.000358"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:22.255478" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:22.255049" elapsed="0.000517">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:22.255630" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:22.254719" elapsed="0.001014">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.255903" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.256069" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.256237" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.256423" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.256588" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.256772" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.256933" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.257097" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.257253" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.257520" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.257687" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.257842" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:22.257380" elapsed="0.000515"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:22.257317" elapsed="0.000603"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.258053" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:22.258112" elapsed="0.000048"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:22.253274" elapsed="0.004980">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:22.258365" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:22.258426" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:22.252694" elapsed="0.005756"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:22.259056" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:22.258740" elapsed="0.000376">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:22.258532" elapsed="0.000647">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:22.258513" elapsed="0.000699">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:22.259257" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:22.221376" elapsed="0.037977">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.259541" elapsed="0.000023"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.259704" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:22.259765" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:22.218996" elapsed="0.040867">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.260025" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.260195" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.260356" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.260530" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.260704" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:22.260862" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:22.260922" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:22.216172" elapsed="0.044847">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:23.292494" 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-11T01:11:23.292048" elapsed="0.000478"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:23.293038" 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-11T01:11:23.292747" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:23.293111" elapsed="0.000038"/>
</return>
<msg time="2026-04-11T01:11:23.293284" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:23.291674" elapsed="0.001634"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:23.297884" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:23.297696" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:23.298083" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:23.298646" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:23.298438" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:23.299094" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:23.298846" elapsed="0.000289"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:23.299275" elapsed="0.000383"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:23.300015" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:23.299808" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:23.300462" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:23.300201" elapsed="0.000302"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:23.300991" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:23.300650" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:23.301430" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:23.301177" elapsed="0.000298"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:23.301927" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:23.301620" elapsed="0.000333"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:23.308217" elapsed="0.000227"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:23.316680" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:23.317422" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:23.317036" elapsed="0.000414"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:23.318591" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:23.318046" elapsed="0.000691">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:23.318895" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:23.317628" elapsed="0.001388">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.319185" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.319351" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.319540" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.319704" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.319864" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.320021" elapsed="0.000054"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.320220" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.320400" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.320568" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.320828" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.321049" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.321378" elapsed="0.000037"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:23.320705" elapsed="0.000772"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:23.320635" elapsed="0.000870"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.321643" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:23.321704" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:23.316187" elapsed="0.005656">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:23.321916" elapsed="0.000017"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:23.306064" elapsed="0.015960">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.322192" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.326312" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.326553" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:23.326620" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:23.297139" elapsed="0.029588">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:23.326838" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:23.326882" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:23.296595" elapsed="0.030309"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:23.327100" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:23.326989" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:23.326968" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:23.328465" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:23.329122" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:23.328822" elapsed="0.000325"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:23.330102" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:23.329668" elapsed="0.000557">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:23.330289" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:23.329319" elapsed="0.001098">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.330589" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.330755" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.330923" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.331085" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.331243" elapsed="0.000019"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.331415" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.331577" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.331741" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.331896" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.332144" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.332309" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.332480" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:23.332024" elapsed="0.000511"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:23.331960" elapsed="0.000601"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.332695" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:23.332754" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:23.327912" elapsed="0.004946">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:23.332968" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:23.333011" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:23.327311" elapsed="0.005722"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:23.333651" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:23.333317" elapsed="0.000394">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:23.333112" elapsed="0.000661">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:23.333094" elapsed="0.000711">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:23.333872" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:23.296039" elapsed="0.037932">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.334140" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.334338" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:23.334420" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:23.293613" elapsed="0.040909">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.334686" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.334857" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.335021" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.335176" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.335336" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:23.335511" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:23.335573" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:23.290957" elapsed="0.044716">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:24.363814" 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-11T01:11:24.363271" elapsed="0.000581"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:24.364344" 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-11T01:11:24.364039" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:24.364439" elapsed="0.000053"/>
</return>
<msg time="2026-04-11T01:11:24.364630" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:24.362864" elapsed="0.001790"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:24.369265" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:24.369069" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:24.369456" elapsed="0.000209"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:24.370288" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:24.369815" elapsed="0.000499"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:24.370783" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:24.370522" elapsed="0.000303"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:24.370967" elapsed="0.000180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:24.371519" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:24.371293" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:24.371949" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:24.371706" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:24.372596" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:24.372147" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:24.373018" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:24.372782" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:24.373506" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:24.373205" elapsed="0.000327"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:24.379838" elapsed="0.000213"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:24.388309" elapsed="0.000229"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:24.389072" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:24.388688" elapsed="0.000410"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:24.390231" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:24.389692" elapsed="0.000742">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:24.390598" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:24.389280" elapsed="0.001442">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.390890" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.391116" elapsed="0.000023"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.391295" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.391475" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.391637" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.391795" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.391954" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.392121" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.392276" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.392574" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.392794" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.392982" elapsed="0.000024"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:24.392446" elapsed="0.000619"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:24.392351" elapsed="0.000745"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.393233" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:24.393291" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:24.387829" elapsed="0.005586">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:24.393485" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:24.377662" elapsed="0.015924">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.393810" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.398054" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.398247" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:24.398313" elapsed="0.000043"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:24.368536" elapsed="0.029964">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:24.398617" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:24.398659" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:24.367965" elapsed="0.030717"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:24.398892" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:24.398773" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:24.398750" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:24.400251" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:24.400921" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:24.400622" elapsed="0.000324"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:24.401722" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:24.401460" elapsed="0.000347">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:24.401868" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:24.401117" elapsed="0.000852">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.402132" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.402294" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.402495" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.402659" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.402816" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.402971" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.403130" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.403292" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.403462" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.403711" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.403873" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.404025" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:24.403591" elapsed="0.000520"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:24.403528" elapsed="0.000611"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.404273" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:24.404333" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:24.399721" elapsed="0.004733">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:24.404567" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:24.404609" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:24.399113" elapsed="0.005519"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:24.405238" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:24.404916" elapsed="0.000383">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:24.404711" elapsed="0.000650">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:24.404693" elapsed="0.000718">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:24.405460" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:24.367415" elapsed="0.038142">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.405726" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.405885" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:24.405946" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:24.364951" elapsed="0.041092">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.406204" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.406414" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.406584" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.406737" elapsed="0.000019"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.406897" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:24.407051" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:24.407111" elapsed="0.000200"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:24.361952" elapsed="0.045464">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:25.438927" 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-11T01:11:25.438449" elapsed="0.000512"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:25.439445" 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-11T01:11:25.439128" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:25.439521" elapsed="0.000044"/>
</return>
<msg time="2026-04-11T01:11:25.439697" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:25.437997" elapsed="0.001724"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:25.444335" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:25.444142" elapsed="0.000220"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:25.444526" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:25.445071" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:25.444866" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:25.445556" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:25.445280" elapsed="0.000318"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:25.445738" elapsed="0.000179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:25.446300" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:25.446063" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:25.446750" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:25.446504" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:25.447273" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:25.446937" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:25.447708" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:25.447473" elapsed="0.000278"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:25.448174" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:25.447894" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:25.454634" elapsed="0.000212"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:25.463127" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:25.463898" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:25.463503" elapsed="0.000422"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:25.465052" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:25.464519" elapsed="0.000689">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:25.465369" elapsed="0.000038"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:25.464106" elapsed="0.001408">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.465687" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.465855" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.466025" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.466188" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.466452" elapsed="0.000023"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.466616" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.466775" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.466940" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.467096" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.467367" elapsed="0.000035"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.467602" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.467788" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:25.467244" elapsed="0.000624"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:25.467169" elapsed="0.000728"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.468039" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:25.468097" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:25.462642" elapsed="0.005563">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:25.468273" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:25.452454" elapsed="0.015918">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.468558" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.472650" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.472839" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:25.472905" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:25.443613" elapsed="0.029398">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:25.473123" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:25.473166" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:25.443047" elapsed="0.030142"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:25.473607" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:25.473479" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:25.473457" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:25.474966" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:25.475680" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:25.475357" elapsed="0.000349"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:25.476525" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:25.476213" elapsed="0.000404">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:25.476680" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:25.475880" elapsed="0.000904">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.476954" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.477121" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.477290" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.477480" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.477644" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.477800" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.477956" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.478116" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.478270" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.478712" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.478877" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.479035" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:25.478586" elapsed="0.000504"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:25.478361" elapsed="0.000754"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.479248" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:25.479305" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:25.474430" elapsed="0.004997">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:25.479541" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:25.479584" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:25.473818" elapsed="0.005788"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:25.480206" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:25.479891" elapsed="0.000376">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:25.479686" elapsed="0.000643">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:25.479668" elapsed="0.000693">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:25.480424" elapsed="0.000017"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:25.442498" elapsed="0.038027">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.480733" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.480896" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:25.480958" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:25.440015" elapsed="0.041042">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.481221" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.481408" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.481575" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.481729" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.481890" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:25.482051" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:25.482111" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:25.437171" elapsed="0.045037">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:26.513917" 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-11T01:11:26.513379" elapsed="0.000575"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:26.514442" 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-11T01:11:26.514127" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:26.514518" elapsed="0.000046"/>
</return>
<msg time="2026-04-11T01:11:26.514698" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:26.512971" elapsed="0.001751"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:26.519245" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:26.519055" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:26.519434" elapsed="0.000193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:26.519980" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:26.519776" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:26.520459" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:26.520189" elapsed="0.000312"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:26.520642" elapsed="0.000184"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:26.521183" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:26.520979" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:26.521923" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:26.521466" elapsed="0.000500"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:26.522481" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:26.522117" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:26.522907" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:26.522670" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:26.523401" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:26.523101" elapsed="0.000327"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:26.529655" elapsed="0.000254"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:26.538201" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:26.538958" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:26.538576" elapsed="0.000408"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:26.540105" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:26.539575" elapsed="0.000680">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:26.540434" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:26.539161" elapsed="0.001394">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.540727" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.540898" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.541069" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.541234" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.541411" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.541574" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.541735" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.541934" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.542097" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.542361" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.542597" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.542784" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:26.542237" elapsed="0.000629"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:26.542167" elapsed="0.000728"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.543029" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:26.543094" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:26.537688" elapsed="0.005513">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:26.543271" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:26.527512" elapsed="0.015920">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.543606" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.547727" elapsed="0.000029"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.547922" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:26.547989" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:26.518526" elapsed="0.029571">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:26.548213" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:26.548257" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:26.517964" elapsed="0.030316"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:26.548565" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:26.548370" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:26.548348" elapsed="0.000283"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:26.549955" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:26.550639" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:26.550311" elapsed="0.000353"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:26.551712" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:26.551255" elapsed="0.000553">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:26.551871" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:26.550839" elapsed="0.001136">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.552144" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.552314" elapsed="0.000055"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.552551" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.552717" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.552877" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.553034" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.553193" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.553354" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.553530" elapsed="0.000073"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.553849" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.554049" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.554209" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:26.553725" elapsed="0.000536"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:26.553654" elapsed="0.000634"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.554438" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:26.554498" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:26.549402" elapsed="0.005201">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:26.554715" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:26.554759" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:26.548776" elapsed="0.006006"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:26.555425" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:26.555085" elapsed="0.000403">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:26.554866" elapsed="0.000684">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:26.554845" elapsed="0.000738">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:26.555628" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:26.517401" elapsed="0.038326">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.555949" elapsed="0.000053"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.556146" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:26.556208" elapsed="0.000172"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:26.515015" elapsed="0.041466">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.556645" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.556817" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.556981" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.557135" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.557295" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:26.557470" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:26.557533" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:26.512082" elapsed="0.045592">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:27.592048" 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-11T01:11:27.591549" elapsed="0.000537"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:27.592582" 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-11T01:11:27.592260" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:27.592659" elapsed="0.000049"/>
</return>
<msg time="2026-04-11T01:11:27.592844" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:27.591140" elapsed="0.001729"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:27.600118" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:27.599919" elapsed="0.000226"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:27.600299" elapsed="0.000215"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:27.600875" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:27.600666" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:27.601376" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:27.601111" elapsed="0.000325"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:27.601581" elapsed="0.000184"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:27.602123" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:27.601912" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:27.602608" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:27.602328" elapsed="0.000344"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:27.603238" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:27.602852" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:27.603788" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:27.603489" elapsed="0.000358"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:27.604366" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:27.604041" elapsed="0.000369"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:27.610626" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:27.619054" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:27.619820" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:27.619427" elapsed="0.000420"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:27.620984" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:27.620451" elapsed="0.000715">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:27.621328" elapsed="0.000021"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:27.620026" elapsed="0.001447">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.621643" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.621872" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.622044" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.622214" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.622374" elapsed="0.000038"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.622553" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.622711" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.622873" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.623028" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.623296" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.623538" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.623724" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:27.623172" elapsed="0.000632"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:27.623099" elapsed="0.000750"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.623989" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:27.624047" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:27.618579" elapsed="0.005576">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:27.624222" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:27.608468" elapsed="0.015853">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.624507" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.628721" elapsed="0.000028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.628910" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:27.628976" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:27.599320" elapsed="0.029786">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:27.629221" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:27.629266" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:27.598711" elapsed="0.030579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:27.629591" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:27.629468" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:27.629443" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:27.630932" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:27.631613" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:27.631292" elapsed="0.000347"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:27.632420" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:27.632143" elapsed="0.000365">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:27.632570" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:27.631813" elapsed="0.000859">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.632836" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.633001" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.633187" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.633351" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.633535" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.633693" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.633853" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.634017" elapsed="0.000019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.634175" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.634442" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.634608" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.634763" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:27.634304" elapsed="0.000512"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:27.634242" elapsed="0.000600"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.634974" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:27.635032" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:27.630381" elapsed="0.004754">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:27.635245" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:27.635288" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:27.629803" elapsed="0.005507"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:27.635929" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:27.635614" elapsed="0.000375">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:27.635406" elapsed="0.000645">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:27.635372" elapsed="0.000745">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:27.636166" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:27.597996" elapsed="0.038269">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.636455" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.636618" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:27.636680" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:27.593224" elapsed="0.043553">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.636937" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.637134" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.637302" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.637472" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.637634" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:27.637792" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:27.637853" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:27.590232" elapsed="0.047718">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:28.667866" 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-11T01:11:28.667347" elapsed="0.000553"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:28.668365" 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-11T01:11:28.668069" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:28.668458" elapsed="0.000041"/>
</return>
<msg time="2026-04-11T01:11:28.668630" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:28.666971" elapsed="0.001684"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:28.673189" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:28.672995" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:28.673366" elapsed="0.000210"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:28.673935" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:28.673725" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:28.674491" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:28.674218" elapsed="0.000316"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:28.674678" elapsed="0.000182"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:28.675215" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:28.675009" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:28.675667" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:28.675418" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:28.676278" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:28.675890" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:28.676718" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:28.676481" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:28.677190" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:28.676909" elapsed="0.000306"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:28.683675" elapsed="0.000232"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:28.692211" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:28.692968" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:28.692587" elapsed="0.000407"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:28.694117" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:28.693589" elapsed="0.000679">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:28.694448" elapsed="0.000020"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:28.693178" elapsed="0.001391">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.694738" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.694906" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.695074" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.695246" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.695423" elapsed="0.000021"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.695584" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.695742" elapsed="0.000019"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.695928" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.696091" elapsed="0.000025"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.696399" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.696623" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.696809" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:28.696262" elapsed="0.000627"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:28.696176" elapsed="0.000743"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.697056" elapsed="0.000055"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:28.697153" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:28.691700" elapsed="0.005562">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:28.697331" elapsed="0.000015"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:28.681467" elapsed="0.015981">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.697620" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.701779" elapsed="0.000027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.701967" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:28.702034" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:28.672462" elapsed="0.029680">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:28.702253" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:28.702297" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:28.671895" elapsed="0.030424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:28.702582" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:28.702465" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:28.702441" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:28.703957" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:28.704634" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:28.704314" elapsed="0.000346"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:28.705448" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:28.705166" elapsed="0.000369">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:28.705597" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:28.704834" elapsed="0.000865">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.705865" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.706032" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.706204" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.706367" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.706589" elapsed="0.000022"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.706749" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.706908" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.707070" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.707231" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.707494" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.707659" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.707817" elapsed="0.000037"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:28.707358" elapsed="0.000536"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:28.707295" elapsed="0.000627"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.708059" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:28.708126" elapsed="0.000019"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:28.703378" elapsed="0.004878">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:28.708369" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:28.708429" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:28.702795" elapsed="0.005658"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:28.709233" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:28.708741" elapsed="0.000553">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:28.708534" elapsed="0.000823">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:28.708516" elapsed="0.000889">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:28.709454" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:28.671311" elapsed="0.038240">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.709720" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.709880" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:28.709941" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:28.668945" elapsed="0.041093">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.710199" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.710371" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.710551" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.710746" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.710908" elapsed="0.000019"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:28.711064" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:28.711125" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:28.666188" elapsed="0.045035">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:29.745628" 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-11T01:11:29.745164" elapsed="0.000498"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:29.746128" 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-11T01:11:29.745833" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:29.746203" elapsed="0.000066"/>
</return>
<msg time="2026-04-11T01:11:29.746420" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:29.744784" elapsed="0.001663"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:29.750984" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:29.750796" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:29.751155" elapsed="0.000190"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:29.751717" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:29.751509" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:29.752182" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:29.751929" elapsed="0.000293"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:29.752362" elapsed="0.000197"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:29.752910" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:29.752705" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:29.753338" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:29.753096" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:29.753880" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:29.753541" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:29.754325" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:29.754066" elapsed="0.000303"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:29.754810" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:29.754528" elapsed="0.000307"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:29.761305" elapsed="0.000227"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:29.769846" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:29.770636" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:29.770205" elapsed="0.000458"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:29.771847" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:29.771292" elapsed="0.000703">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:29.772156" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:29.770899" elapsed="0.001374">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.772461" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.772631" elapsed="0.000021"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.772800" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.772963" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.773123" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.773281" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.773458" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.773625" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.773782" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.774050" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.774277" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.774497" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:29.773925" elapsed="0.000655"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:29.773852" elapsed="0.000756"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.774748" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:29.774808" elapsed="0.000016"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:29.769353" elapsed="0.005565">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:29.774989" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:29.759122" elapsed="0.015969">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.775262" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.779374" elapsed="0.000039"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.779579" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:29.779698" elapsed="0.000017"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:29.750233" elapsed="0.029574">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:29.779919" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:29.779964" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:29.749691" elapsed="0.030297"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:29.780189" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:29.780074" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:29.780054" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:29.781581" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:29.782246" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:29.781941" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:29.783072" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:29.782810" elapsed="0.000354">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:29.783226" elapsed="0.000017"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:29.782476" elapsed="0.000853">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.783514" elapsed="0.000022"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.783682" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.783851" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.784015" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.784176" elapsed="0.000020"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.784335" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.784520" elapsed="0.000021"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.784686" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.784843" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.785246" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.785433" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.785594" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:29.784971" elapsed="0.000677"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:29.784908" elapsed="0.000767"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.785811" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:29.785871" elapsed="0.000016"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:29.781028" elapsed="0.004949">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:29.786089" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:29.786170" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:29.780439" elapsed="0.005756"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:29.786850" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:29.786532" elapsed="0.000378">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:29.786277" elapsed="0.000696">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:29.786258" elapsed="0.000748">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:29.787053" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:29.749133" elapsed="0.038018">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.787322" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.787501" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:29.787566" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:29.746738" elapsed="0.040927">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.787829" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.788006" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.788172" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.788330" elapsed="0.000020"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.788508" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:29.788669" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:29.788731" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:29.744033" elapsed="0.044796">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Verify_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.817927" 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-11T01:11:30.817459" elapsed="0.000502"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.818436" 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-11T01:11:30.818125" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-11T01:11:30.818512" elapsed="0.000040"/>
</return>
<msg time="2026-04-11T01:11:30.818680" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-11T01:11:30.817056" elapsed="0.001649"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-11T01:11:30.823322" level="INFO">${device_type} = openflow</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-11T01:11:30.823133" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:30.823512" elapsed="0.000192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:30.824063" level="INFO">${device_id_prefix} = </msg>
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:30.823855" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.824572" level="INFO"/>
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:30.824275" elapsed="0.000340"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-11T01:11:30.824757" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:30.825295" level="INFO">${device_id_suffix} = </msg>
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-11T01:11:30.825086" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.825743" level="INFO"/>
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:30.825499" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.826464" level="INFO">${id} = openflow:1</msg>
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:30.825930" elapsed="0.000561"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.826894" level="INFO">openflow:1</msg>
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:30.826654" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.827364" level="INFO">${type} = org.opendaylight.mdsal.ServiceEntityType</msg>
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:30.827083" elapsed="0.000321"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Find a way to unify and deduplicate code blocks in Get_Owner_And_Candidates_* keywords.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:30.833675" elapsed="0.000211"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:30.842139" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.842891" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:30.842510" elapsed="0.000406"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:30.844041" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.843507" elapsed="0.000683">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.844351" elapsed="0.000019"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.843093" elapsed="0.001393">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.844668" elapsed="0.000023"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.844836" elapsed="0.000020"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.845004" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.845167" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.845330" elapsed="0.000024"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.845510" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.845669" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.845832" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.845988" elapsed="0.000020"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.846262" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.846538" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.846726" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:30.846130" elapsed="0.000678"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.846057" elapsed="0.000781"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.846974" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.847034" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidates}</var>
<arg>${id}</arg>
<arg>${type}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ${device_name} of type ${device_type}. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.841660" elapsed="0.005481">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${owner}</value>
<value>${candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.847209" elapsed="0.000016"/>
</return>
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.831492" elapsed="0.015817">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.847493" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by org.opendaylight.mdsal.ServiceEntityType and openflow:1
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.851609" elapsed="0.000026"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.851797" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.851863" elapsed="0.000015"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.822600" elapsed="0.029368">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:30.852078" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:30.852121" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:30.822032" elapsed="0.030112"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.852348" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:30.852230" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:30.852209" elapsed="0.000260"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:30.853779" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.854448" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-11T01:11:30.854133" elapsed="0.000341"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-11T01:11:30.855233" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.854973" elapsed="0.000346">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.855394" elapsed="0.000164"/>
</return>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.854646" elapsed="0.001003">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.855818" elapsed="0.000021"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.856019" elapsed="0.000022"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.856190" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.856362" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.856548" elapsed="0.000042"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.856731" elapsed="0.000021"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.856890" elapsed="0.000020"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.857054" elapsed="0.000021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.857210" elapsed="0.000021"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.857482" elapsed="0.000022"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.857649" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.857804" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-11T01:11:30.857339" elapsed="0.000518"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.857275" elapsed="0.000608"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.858016" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.858075" elapsed="0.000019"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.853234" elapsed="0.004951">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-11T01:11:30.858295" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-11T01:11:30.858338" level="INFO">${results} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-11T01:11:30.852639" elapsed="0.005721"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.858976" level="FAIL">Could not parse owner and candidates for device openflow:1</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.858662" elapsed="0.000374">Could not parse owner and candidates for device openflow:1</status>
</kw>
<status status="FAIL" start="2026-04-11T01:11:30.858456" elapsed="0.000642">Could not parse owner and candidates for device openflow:1</status>
</branch>
<status status="FAIL" start="2026-04-11T01:11:30.858437" elapsed="0.000693">Could not parse owner and candidates for device openflow:1</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.859176" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device openflow:1 of type openflow. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.821483" elapsed="0.037788">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.859455" elapsed="0.000022"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.859616" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.859679" elapsed="0.000015"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device openflow:1 of type openflow. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-11T01:11:30.819080" elapsed="0.040696">Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.859984" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.860157" elapsed="0.000020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.860320" elapsed="0.000020"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.860494" elapsed="0.000021"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.860669" elapsed="0.000021"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.860830" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.860892" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.816267" elapsed="0.044722">Could not parse owner and candidates for device openflow:1</status>
</kw>
<msg time="2026-04-11T01:11:30.861090" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>30s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=openflow</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<arg>after_stop=${after_stop}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.661180" elapsed="30.199999">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-11T01:11:30.861255" elapsed="0.000015"/>
</return>
<var>${original_owner}</var>
<var>${original_successor_list}</var>
<arg>openflow:1</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.659167" elapsed="30.202184">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_owner}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.861552" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_cluster_list}</arg>
<arg>${original_successor_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-11T01:11:30.861716" elapsed="0.000020"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.862887" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:11:30.862479" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-11T01:11:30.863126" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-11T01:11:30.862986" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:30.862969" elapsed="0.000218"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-11T01:11:30.863336" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.864413" level="FAIL">'9145' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.864055" elapsed="0.000418">'9145' does not contain '-'</status>
</kw>
<msg time="2026-04-11T01:11:30.864563" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-11T01:11:30.863713" elapsed="0.000897"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.865103" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=9145</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-11T01:11:30.864776" elapsed="0.000353"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.865583" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=9145</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-11T01:11:30.865280" elapsed="0.000329"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.866042" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-11T01:11:30.865755" elapsed="0.000313"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.866637" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=9145

Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-11T01:11:30.866251" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.867069" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=9145</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-11T01:11:30.866832" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-04-11T01:11:30.867758" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=9145'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-04-11T01:11:30.867422" elapsed="0.000383"/>
</kw>
<status status="PASS" start="2026-04-11T01:11:30.867179" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-04-11T01:11:30.867160" elapsed="0.000702"/>
</if>
<arg>9145</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-11T01:11:30.862119" elapsed="0.005788"/>
</kw>
<doc>Check Entity Owner Status and identify owner and successor for first switch s1.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=9145</tag>
<status status="FAIL" start="2026-04-11T01:11:00.651223" elapsed="30.216729">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=9145

Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 30 seconds. The last error was: Could not parse owner and candidates for device openflow:1</status>
</test>
<test id="s1-s8-t3" name="Stop Mininet" line="34">
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<msg time="2026-04-11T01:11:30.876586" level="FAIL">Variable '${mininet_conn_id}' not found.</msg>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="FAIL" start="2026-04-11T01:11:30.872855" elapsed="0.003782">Variable '${mininet_conn_id}' not found.</status>
</kw>
<doc>Stop Mininet.</doc>
<status status="FAIL" start="2026-04-11T01:11:30.868433" elapsed="0.008339">Variable '${mininet_conn_id}' not found.</status>
</test>
<kw name="Final Phase" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-11T01:11:30.877537" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-11T01:11:30.877458" elapsed="0.000166"/>
</kw>
<doc>Delete all sessions.</doc>
<status status="PASS" start="2026-04-11T01:11:30.877228" elapsed="0.000447"/>
</kw>
<doc>Switch connections and cluster are restarted.</doc>
<status status="FAIL" start="2026-04-11T01:11:00.527625" elapsed="30.350079"/>
</suite>
<status status="FAIL" start="2026-04-11T00:46:38.925544" elapsed="1491.953520"/>
</suite>
<statistics>
<total>
<stat pass="12" fail="197" skip="0">All Tests</stat>
</total>
<tag>
<stat pass="0" fail="3" skip="0">https://bugs.opendaylight.org/show_bug.cgi?id=6177</stat>
<stat pass="0" fail="1" skip="0">https://bugs.opendaylight.org/show_bug.cgi?id=9145</stat>
<stat pass="0" fail="1" skip="0">https://jira.opendaylight.org/browse/CONTROLLER-1849</stat>
</tag>
<suite>
<stat name="openflowplugin-clustering.txt" id="s1" pass="12" fail="197" skip="0">openflowplugin-clustering.txt</stat>
<stat name="Cluster HA Owner Failover" id="s1-s1" pass="3" fail="48" skip="0">openflowplugin-clustering.txt.Cluster HA Owner Failover</stat>
<stat name="Cluster HA Owner Restart" id="s1-s2" pass="3" fail="48" skip="0">openflowplugin-clustering.txt.Cluster HA Owner Restart</stat>
<stat name="Cluster HA Data Recovery Leader Follower Failover" id="s1-s3" pass="4" fail="17" skip="0">openflowplugin-clustering.txt.Cluster HA Data Recovery Leader Follower Failover</stat>
<stat name="010 Group Flows" id="s1-s4" pass="2" fail="70" skip="0">openflowplugin-clustering.txt.010 Group Flows</stat>
<stat name="010 Switch Disconnect" id="s1-s5" pass="0" fail="3" skip="0">openflowplugin-clustering.txt.010 Switch Disconnect</stat>
<stat name="020 Cluster Node Failure" id="s1-s6" pass="0" fail="3" skip="0">openflowplugin-clustering.txt.020 Cluster Node Failure</stat>
<stat name="030 Cluster Sync Problems" id="s1-s7" pass="0" fail="5" skip="0">openflowplugin-clustering.txt.030 Cluster Sync Problems</stat>
<stat name="9145" id="s1-s8" pass="0" fail="3" skip="0">openflowplugin-clustering.txt.9145</stat>
</suite>
</statistics>
<errors>
</errors>
</robot>
